2016-01-15 19 views
12

Cercando di trovare un modo LINQ per farlo, ma non mi viene in mente niente.Elenco <stringhe separate da virgole> => Elenco <string>?

Ho una lista <> di oggetti che includono una proprietà che è un elenco separato da virgole di codici alfanumerici:

lst[0].codes = "AA,BB,DD" 
lst[1].codes = "AA,DD,EE" 
lst[2].codes = "GG,JJ" 

Vorrei un elenco di tali codici, si spera nella forma di un Elenco di stringhe:

result = AA,BB,DD,EE,GG,JJ 

Grazie per qualsiasi direzione.

+5

Ti piace questa 'lst.SelectMany (x => x.Split ('')) .Distinct(). ToList() 'ma con una migliore analisi CSV ... –

+0

@AdrianoRepetti, dipende piuttosto se i dati provengono da un file CSV. OP non dice che le stringhe potrebbero contenere virgole sfuggite. – Jodrell

+0

Grazie, @AdrianoRepetti. Il semplice string.split() è un'analisi sufficiente per questi scopi. –

risposta

21

Utilizzare SelectMany per ottenere tutti i codici e utilizzare Distinct per non ripetere i valori. provare qualcosa di simile:

var result = lst.SelectMany(x => x.codes.Split(",")).Distinct().ToList(); 
+1

Certo, mio ​​male, Ty –

+0

Grazie, @Joel. Mai usato SelectMany() prima. –

+0

@johnpaz Ovviamente hai chiesto esplicitamente un 'Elenco <>', ma potresti anche usare un * set * o qualcosa che non può avere duplicati, come in 'var result = new SortedSet (lst.SelectMany (x => x.codes.Split (""))); '. –

6

è necessario utilizzare Split per dividere ogni stringa in più stringhe. Quindi è necessario utilizzare SelectMany per concatenare più sequenze in una singola sequenza e quindi è necessario utilizzare Distinct per rimuovere i duplicati.

var result = 
    lst 
    .SelectMany(x => x.codes.Split(',')) 
    .Distinct() 
    .ToList(); 
0

se avete bisogno di un string come risultato:

string result = string.Join(",",lst.SelectMany(p=>p.codes.Split(",")).Distinct()); 
-1

Prova questo:

List<string> list = new List<string>(); 

    char[] sep = new char[1]; 
    sep[0] = ','; 
    foreach (string item in lst) 
    { 
     list.AddRange(item.Split(sep)); 
    } 

    list = list.Distinct().ToList();