2009-03-26 21 views
7

मेरे पास एक सूची है जिसमें तारों का एक समूह होता है जो एक से अधिक बार हो सकता है। मैं इस सूची को लेना चाहता हूं और सूची वस्तुओं का एक शब्दकोश कुंजी के रूप में और उनकी घटनाओं की गणना मान के रूप में बनाना चाहता हूं।सूची में वस्तुओं की संख्या का एक शब्दकोश बनाना

उदाहरण:

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

मैं यह करने के लिए एक रास्ता है, लेकिन यह नहीं लगता है जैसे मैं अच्छा उपयोग कर रहा हूँ:

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"); 

और परिणाम एक शब्दकोश युक्त होगा सी # में सामान 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; 
} 

उत्तर

20

आप ऐसा करने के लिए समूह # में समूह खंड का उपयोग कर सकते हैं। में एक Dictionary<string, int>

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

यहाँ से यह यह जगह के लिए एक छोटी हॉप है:

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() }; 

आप सीधे रूप में अच्छी तरह विस्तार के तरीकों कॉल कर सकते हैं अगर आप चाहते हैं

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

कैसे आप एक orderby पहला उदाहरण के लिए जोड़ होगा? – zadam

+0

@zadam आप हमेशा 'समूह = समूह। ऑर्डर बी (जी => जी.स्टफ)' कह सकते हैं; – casperOne

1

एक विचार शब्दकोश शून्य के default value देने के लिए किया जाएगा, ताकि आप wou पहली घटना को विशेष घटना नहीं है।

+0

ठीक है, कि सिर्फ कोड है कि एक अलग वर्ग में विशेष मामला संभालती चलती होगा ... – Guffa

0

ठीक है, यह करने के लिए वास्तव में कोई बेहतर तरीका नहीं है।

शायद आप एक LINQ क्वेरी लिख सकते हैं जो तारों को समूहित करेगा और फिर गिनती होगी कि प्रत्येक समूह में कितने तार हैं, लेकिन यह आपके पास पहले से ही उतना ही कुशल नहीं होगा जितना आपके पास है।

7

मैं एक विशेष सूची बनाउंगा, जो शब्दकोश द्वारा समर्थित है और ऐड विधि सदस्यता के लिए परीक्षण करेगी और यदि मिलती है तो गिनती बढ़ेगी।

तरह sorta:

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); 
    } 
} 
संबंधित मुद्दे