2010-04-04 17 views
5

Me gustaría saber cómo puedo contar la cantidad de valores únicos en una matriz dentada.Cómo encontrar valores únicos en la matriz dentada

Mi objeto de dominio contiene una propiedad de cadena que tiene valores delimitados por espacios.

class MyObject 
{ 
    string MyProperty; //e.g = "v1 v2 v3" 
} 

dado una lista deMiObjeto 's cómo puedo determinar el número de valores únicos ?

El siguiente código linq devuelve una matriz de valores de matriz irregulares. Una solución sería almacenar una única matriz temporal de elementos, en bucle a través de cada matriz dentada y si los valores no existen, para agregarlos. Entonces, un conteo simple devolvería el número único de valores. Sin embargo, me preguntaba si había una mejor solución .

db.MyObjects.Where(t => !String.IsNullOrEmpty(t.MyProperty)) 
    .Select(t => t.Categories.Split(new char[] { ' ' }, 
     StringSplitOptions.RemoveEmptyEntries)) 
    .ToArray() 

A continuación se muestra un ejemplo más legible:

array[0] = { "v1", "v2", "v3" } 
array[1] = { "v1" } 
array[2] = { "v4", "v2" } 
array[3] = { "v1", "v5" } 

De todos los valores de los artículos únicos son v1, v2, v3, v4, v5. El número total de artículos únicos es .

¿Existe alguna solución, posiblemente utilizando linq, que devuelva solo los valores únicos o devuelva el número de valores únicos?

Respuesta

8

Sí, con LINQ esto es bastante simple. En primer lugar utilizar SelectMany para aplanar la matriz escalonada en un IEnumerable<string> que contiene todos los valores y luego llamar Distinct para seleccionar sólo valores únicos:

IEnumerable<string> uniqueValues = array.SelectMany(x => x).Distinct(); 

Si desea contar con ellos a continuación, utilizar Count:

IEnumerable<string> uniqueValues = array.SelectMany(x => x).Distinct(); 
int uniqueCount = uniqueValues.Count(); 
5

Una consulta El método de expresión es

var query = (from arr in array 
      from value in arr 
      select value).Distinct(); 
+0

Solo un FYI para los lectores ... esta respuesta y la respuesta de Mark Byers son efectivamente las mismas ng con diferente sintaxis. La respuesta fundamental es "Seleccionar muchos". :) – jrista

Cuestiones relacionadas