2009-01-21 2 views
1

J'ai plusieurs listes de chaînes, IList<string>, que je veux consolider dans une liste montrant une chaîne et un nombre distincts pour chaque article (comme un dictionnaire). Quel est le moyen le plus efficace de le faire?Ajout de listes ensemble

+0

Hmm, je pensais que c'était double, mais je suppose que ce n'est pas à cause de la partie « dictionnaire ». –

Répondre

1
Dictionary<string, int> count = new Dictionary<string, int>(); 

foreach(IList<int> list in lists) 
    foreach(int item in list) { 
    int value; 
    if (count.TryGetValue(item, out value)) 
     count[item] = value + 1; 
    else 
     count[item] = 1; 
    } 
+0

serait-ce plus rapide que la solution Linq ci-dessus? – zsharp

+0

Je pense que ça devrait être un peu plus rapide. Cependant, vous devriez référencer pour voir avec précision. Le principal avantage est la compatibilité avec le compilateur C# 2.0. –

+0

im un peu peur de compter sur linq. – zsharp

3

LINQ (certainement le plus efficace en termes de code type et maintenir, la performance globale sera au sujet le même que toute autre approche):

si les listes sont variables distinctes:

var qry = from s in listA.Concat(listB).Concat(listC) // etc 
      group s by s into tmp 
      select new { Item = tmp.Key, Count = tmp.Count() }; 

si les listes sont tous dans une liste des parents (des listes):

var qry = from list in lists 
      from s in list 
      group s by s into tmp 
      select new { Item = tmp.Key, Count = tmp.Count() }; 

Ensuite, si vous voulez vraiment une liste:

var resultList = qry.ToList(); 
+0

le deuxième exemple ne semble pas fonctionner. il ne permettra pas la deuxième "liste". – zsharp

+0

@zsharp - ça marche bien (je viens de vérifier deux fois). Avez-vous une variable locale appelée "liste"? Notez la seule variable avant la requête dans l'exemple est "listes". –

1
List<List<string>> source = GetLists(); 
//  
Dictionary<string, int> result = source 
    .SelectMany(sublist => sublist) 
    .GroupBy(s => s) 
    .ToDictionary(g => g.Key, g => g.Count())