2012-05-25 15 views
20

करने के लिए चयन मैं एक LINQ क्वेरी उनके प्रकार द्वाराLinq नई वस्तु

var x = (from t in types select t).GroupBy(g =>g.Type) 

जो समूहों वस्तुओं है, एक परिणाम के रूप में मैं वर्गीकृत किया वस्तुओं और उनकी गिनती के सभी युक्त एक नई वस्तु करना चाहते हैं। कुछ इस तरह:

type1, 30  
type2, 43  
type3, 72 

अधिक स्पष्ट होना: समूहीकरण परिणाम एक वस्तु में होना चाहिए नहीं आइटम प्रकार

उत्तर

24

पढ़ें: कि LINQ - Grouping Operators माइक्रोसॉफ्ट MSDN साइट से में 101 LINQ Samples

var x = from t in types group t by t.Type 
     into grp  
     select new { type = grp.key, count = grp.Count() }; 

forsingle वस्तु stringbuilder का इस्तेमाल करते हैं और संलग्न है कि या शब्दकोश

// fordictionary 
    var x = (from t in types group t by t.Type 
    into grp  
    select new { type = grp.key, count = grp.Count() }) 
    .ToDictionary(t => t.type, t => t.count); 

    //for stringbuilder not sure for this 
    var x = from t in types group t by t.Type 
     into grp  
     select new { type = grp.key, count = grp.Count() }; 
    StringBuilder MyStringBuilder = new StringBuilder(); 

    foreach (var res in x) 
    { 
     //: is separator between to object 
     MyStringBuilder.Append(result.Type +" , "+ result.Count + " : "); 
    } 
    Console.WriteLine(MyStringBuilder.ToString()); 
+0

धन्यवाद, यह मेरे लिए काफी अच्छा है – Jeff

19

वर्गीकृत किया वस्तुओं सब के सब, या प्रकार के सभी प्रति एक वस्तु? ऐसा लगता है कि तुम सिर्फ कर सकते हैं:

var query = types.GroupBy(t => t.Type) 
       .Select(g => new { Type = g.Key, Count = g.Count() }); 

foreach (var result in query) 
{ 
    Console.WriteLine("{0}, {1}", result.Type, result.Count); 
} 

संपादित करें: यदि आप एक शब्दकोश में यह चाहते हैं, तो आप सिर्फ उपयोग कर सकते हैं:

var query = types.GroupBy(t => t.Type) 
       .ToDictionary(g => g.Key, g => g.Count()); 

जोड़े में चयन करने के लिए कोई ज़रूरत नहीं है और फिर शब्दकोश का निर्माण करें।

+0

गैर स्पष्ट प्रश्न के लिए खेद है। आपका समाधान मुझे जो चाहिए, उसके समान ही है, लेकिन मैं सभी समूह परिणामों को एकल ऑब्जेक्ट में रखना चाहता हूं, प्रति ऑब्जेक्ट प्रति ऑब्जेक्ट नहीं – Jeff

+1

@ जेफ: आपके द्वारा स्वीकार किया गया जवाब प्रभावी रूप से मेरा जैसा ही है ... बस एक शब्दकोश में । परिणाम * सभी * एक ही ऑब्जेक्ट ('क्वेरी') में हैं। यह अभी भी स्पष्ट नहीं है कि आप क्या हासिल करना चाहते हैं कि मेरा समाधान आपके लिए नहीं करता है। यदि आप प्रकार के अनुसार समूह में जा रहे हैं, तो आपको प्रति समूह एक ऑब्जेक्ट प्राप्त करने के लिए * मिला है, लेकिन यहां 'क्वेरी' क्वेरी है जो आपको उन सभी समूहों को * देगी * देगी। –

+0

अच्छी तरह से मुझे पता है कि मैं समूहबद्ध सूची में किस प्रकार की तलाश कर रहा हूं, इसलिए इसे शब्दकोश में रखते हुए क्वेरी – Jeff

3
var x = from t in types 
     group t by t.Type into grouped 
     select new { type = grouped.Key, 
        count = grouped.Count() }; 
+0

साइड प्रश्न: सामान्य रूप से, यदि आप एक नया चयन करते हैं तो {..} क्या आप अपडेट करते समय डीबी में कुछ डालते हैं? –

+0

@DanyKhalife जब आप चुनिंदा वक्तव्य का उपयोग कर रहे हैं तो आपको अपडेट चेंज को कॉल करने की आवश्यकता नहीं है। यदि आप इसका उपयोग करते हैं, तो यह कुछ भी सम्मिलित नहीं करेगा, यह केवल डीबी में एक चयन कथन निष्पादित करेगा। – daryal

1

के रूप में परिवर्तित कर देंगे यदि आप अपनी आवृत्ति प्राप्त करने के लिए प्रत्येक प्रकार पर एक लुकअप करने में सक्षम होना चाहते हैं तो आपको गणना को एक शब्दकोश में बदलना होगा। यहाँ

var types = new[] {typeof(string), typeof(string), typeof(int)}; 
var x = types 
     .GroupBy(type => type) 
     .ToDictionary(g => g.Key, g => g.Count()); 
foreach (var kvp in x) { 
    Console.WriteLine("Type {0}, Count {1}", kvp.Key, kvp.Value); 
} 
Console.WriteLine("string has a count of {0}", x[typeof(string)]); 
14

जवाब मुझे पास गया, लेकिन 2016 में, मैं निम्नलिखित LINQ लिखने में सक्षम था:

List<ObjectType> objectList = similarTypeList.Select(o => 
    new ObjectType 
    { 
     PropertyOne = o.PropertyOne, 
     PropertyTwo = o.PropertyTwo, 
     PropertyThree = o.PropertyThree 
    }).ToList(); 
+1

यह अच्छा और निर्देशक है! धन्यवाद! –

0

यह एक LINQ क्वेरी से नई वस्तुओं बनाने के लिए आवश्यक वाक्य रचना के लिए एक महान लेख है ।

लेकिन, यदि ऑब्जेक्ट के फ़ील्ड में भरने के लिए असाइनमेंट सरल असाइनमेंट से अधिक कुछ हैं, उदाहरण के लिए, पूर्णांक में तारों को पार्स करना, और उनमें से एक विफल हो जाता है, तो इसे डीबग करना संभव नहीं है। आप किसी भी व्यक्तिगत असाइनमेंट पर ब्रेकपॉइंट नहीं बना सकते हैं।

और यदि आप सभी असाइनमेंट को सबराउटिन में ले जाते हैं, और वहां से एक नई वस्तु वापस कर देते हैं, और उस दिनचर्या में ब्रेकपॉइंट सेट करने का प्रयास करते हैं, तो आप उस दिनचर्या में ब्रेकपॉइंट सेट कर सकते हैं, लेकिन ब्रेकपॉइंट कभी ट्रिगर नहीं होगा।

तो बजाय: मुझे आसानी से डिबग और यह पता लगाने जो काम करने के लिए असफल रहा था

List<SuggestionItem> retList = new List<SuggestionItem>(); 

var query = from c in doc.Descendants("SuggestionItem") select c; 

foreach (XElement item in query) 
{ 
    SuggestionItem anItem = new SuggestionItem(item); 
    retList.Add(anItem); 
} 

यह अनुमति दी:

var query2 = from c in doc.Descendants("SuggestionItem") 
       select new SuggestionItem 
         { Phrase = c.Element("Phrase").Value 
         Blocked = bool.Parse(c.Element("Blocked").Value), 
         SeenCount = int.Parse(c.Element("SeenCount").Value) 
         }; 

या

var query2 = from c in doc.Descendants("SuggestionItem") 
         select new SuggestionItem(c); 

मैं बजाय ऐसा किया।इस मामले में, XElement में एक फ़ील्ड गुम हो रहा था जिसे मैं सुझाव Item में सेट करने के लिए पार्सिंग कर रहा था।

मैं विजुअल स्टूडियो 2017 के साथ इन गॉथस में भाग गया, जबकि एक नई लाइब्रेरी दिनचर्या के लिए इकाई परीक्षण लिख रहा था।

संबंधित मुद्दे