2009-03-26 15 views
7

Ich habe eine Liste mit einer Reihe von Zeichenfolgen, die mehrmals vorkommen können. Ich möchte diese Liste nehmen und ein Wörterbuch der Listenelemente als den Schlüssel und die Zählung ihrer Vorkommen als den Wert aufbauen.Erstellen eines Wörterbuchs mit Zählungen von Elementen in einer Liste

Beispiel:

"Peanut Butter", 2 
"Jam", 2 
"Food", 2 
"Snacks", 1 
"Philosophy", 1 

Ich habe einen Weg, dies zu tun, aber es scheint nicht, wie ich das gute Verwendung bin:

List<string> stuff = new List<string>(); 
stuff.Add("Peanut Butter"); 
stuff.Add("Jam"); 
stuff.Add("Food"); 
stuff.Add("Snacks"); 
stuff.Add("Philosophy"); 
stuff.Add("Peanut Butter"); 
stuff.Add("Jam"); 
stuff.Add("Food"); 

und das Ergebnis ein Wörterbuch enthält, wäre Sachen in C# 3,0

public Dictionary<string, int> CountStuff(IList<string> stuffList) 
{ 
    Dictionary<string, int> stuffCount = new Dictionary<string, int>(); 

    foreach (string stuff in stuffList) { 
     //initialize or increment the count for this item 
     if (stuffCount.ContainsKey(stuff)) { 
      stuffCount[stuff]++; 
     } else { 
      stuffCount.Add(stuff, 1); 
     } 
    } 

    return stuffCount; 
} 

Antwort

20

Sie können die Gruppenklausel in C# dazu verwenden.

List<string> stuff = new List<string>(); 
... 

var groups = from s in stuff group s by s into g select 
    new { Stuff = g.Key, Count = g.Count() }; 

Sie können die Erweiterungsmethoden aufrufen sowohl direkt als auch, wenn Sie wollen:

var groups = stuff.GroupBy(s => s).Select(
    s => new { Stuff = s.Key, Count = s.Count() }); 

Von hier aus ist es ein Katzensprung in eine Dictionary<string, int> zu platzieren:

var dictionary = groups.ToDictionary(g => g.Stuff, g => g.Count); 
+0

Wie würden Sie einen orderby dem ersten Beispiel hinzufügen? – zadam

+0

@zadam Sie können immer sagen: groups = groups.OrderBy (g => g.Stuff) '; – casperOne

1

eine Idee wäre, das Wörterbuch ein default value von Null zu geben, so dass Sie wou Das erste Vorkommen muss nicht speziell behandelt werden.

+0

Nun, das wäre nur den Code zu bewegen, die den Sonderfall in eine separate Klasse behandelt ... – Guffa

0

Nun, es ist nicht wirklich ein besserer Weg, es zu tun.

Vielleicht könnten Sie eine LINQ-Abfrage schreiben, die die Strings gruppiert und dann zählt, wie viele Strings es in jeder Gruppe gibt, aber das wäre nicht annähernd so effizient wie das, was Sie bereits haben.

7

Ich hätte eine spezialisierte Liste erstellt, die durch das Dictionary unterstützt wird und die Add-Methode würde auf Mitgliedschaft testen und die Anzahl erhöhen, wenn sie gefunden wird.

sorta mag:

public class CountingList 
{ 
    Dictionary<string, int> countingList = new Dictionary<string, int>(); 

    void Add(string s) 
    { 
     if(countingList.ContainsKey(s)) 
      countingList[ s ] ++; 
     else 
      countingList.Add(s, 1); 
    } 
} 
Verwandte Themen