2010-04-04 20 views
5

Vorrei sapere come posso contare il numero di valori univoci in una matrice seghettata.Come trovare valori univoci nell'array frastagliato

Il mio oggetto dominio contiene una proprietà stringa con valori delimitati dallo spazio.

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

dato un lista di MyObject s' come posso determinare il numero di valori unici?

Il seguente codice linq restituisce una matrice di valori di matrice frastagliata. Una soluzione sarebbe quella di memorizzare un singolo array temporaneo di elementi, in loop su ogni array frastagliato e se i valori non esistono, per aggiungerli. Quindi un conteggio semplice restituirebbe il numero univoco di valori. Tuttavia, mi chiedevo se ci fosse una soluzione più bella.

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

Di seguito è riportato un esempio più leggibile:

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

Da tutti i valori i pezzi unici sono v1, v2, v3, v4, v5.

Il numero totale di articoli unici è .

C'è una soluzione, possibilmente utilizzando linq, che restituisce solo i valori univoci o restituisce il numero di valori univoci?

risposta

8

Sì, con LINQ questo è abbastanza semplice. In primo luogo utilizzare SelectMany per appiattire la matrice irregolare in un IEnumerable<string> contenente tutti i valori e quindi chiamare Distinct per selezionare solo valori unici:

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

Se volete contarli quindi utilizzare Count:

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

Una query Il metodo expression è

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

Solo una FYI per i lettori ... questa risposta e la risposta di Mark Byers sono effettivamente le stesse ng con sintassi diversa. La risposta fondamentale è "Seleziona molti". :) – jrista

Problemi correlati