2011-08-04 17 views
75

का उपयोग कर एकाधिक कॉलम के साथ समूह lambda का उपयोग करके मैं एकाधिक कॉलम के साथ कैसे समूह कर सकता हूं?लैम्बडा

मैंने उदाहरणों के लिए linq का उपयोग करके इसे कैसे किया जाए, लेकिन मैं लैम्ब्डा रूप की तलाश में हूं।

+0

आप के मन में एक विशिष्ट क्वेरी है? –

उत्तर

150
var query = source.GroupBy(x => new { x.Column1, x.Column2 }); 
+0

क्या यह वास्तव में काम करेगा? मुझे लगता है कि आपके द्वारा समूहित किए जा रहे प्रत्येक ऑब्जेक्ट के लिए समानता परीक्षण विफल हो जाएगा क्योंकि वे ऑब्जेक्ट्स हैं और structs नहीं हैं। – Jacob

+0

@Aducci: धन्यवाद। क्या आप उदाहरण दे सकते हैं कि मैं समूह वस्तुओं के IENumerable कैसे प्राप्त कर सकता हूं? – Naor

+4

@ जैकोब - बेनामी प्रकार अपरिवर्तनीय कक्षाएं हैं जो ठीक से 'GetHashCode' और' समान 'विधियों को ओवरराइड करते हैं। वे जहां इस तरह के उपयोग के मामले के लिए डिजाइन किया गया है। – Enigmativity

8

यदि आपकी तालिका के ऊपर इस

rowId  col1 col2 col3 col4 
1   a  e  12  2 
2   b  f  42  5 
3   a  e  32  2 
4   b  f  44  5 


var grouped = myTable.AsEnumerable().GroupBy(r=> new {pp1 = r.Field<int>("col1"), pp2 = r.Field<int>("col2")}); 
2

इसके अलावा aduchis का जवाब की तरह है - यदि आप तो कुंजी द्वारा उन समूह के आधार पर फ़िल्टर करने की जरूरत है, आप कई कुंजी रैप करने के लिए एक वर्ग को परिभाषित कर सकते हैं।

return customers.GroupBy(a => new CustomerGroupingKey(a.Country, a.Gender)) 
       .Where(a => a.Key.Country == "Ireland" && a.Key.Gender == "M") 
       .SelectMany(a => a) 
       .ToList(); 

कहाँ CustomerGroupingKey समूह प्रयास लगता है:

private class CustomerGroupingKey 
    { 
     public CustomerGroupingKey(string country, string gender) 
     { 
      Country = country; 
      Gender = gender; 
     } 

     public string Country { get; } 

     public string Gender { get; } 
    } 
+0

शायद किसी को कुछ समय बचाएगा: ऑब्जेक्ट प्रारंभकर्ताओं के साथ डिफ़ॉल्ट निर्माण का उपयोग करना बेहतर है। उपरोक्त नमूना कोड में दृष्टिकोण ** ** ** ईएफ कोर अच्छी तरह से ओआरएम द्वारा इलाज नहीं किया जाएगा। – Konstantin

0
 class Element 
     { 
      public string Company;   
      public string TypeOfInvestment; 
      public decimal Worth; 
     } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
     List<Element> elements = new List<Element>() 
      { 
       new Element { Company = "JPMORGAN CHASE",TypeOfInvestment = "Stocks", Worth = 96983 }, 
       new Element { Company = "AMER TOWER CORP",TypeOfInvestment = "Securities", Worth = 17141 }, 
       new Element { Company = "ORACLE CORP",TypeOfInvestment = "Assets", Worth = 59372 }, 
       new Element { Company = "PEPSICO INC",TypeOfInvestment = "Assets", Worth = 26516 }, 
       new Element { Company = "PROCTER & GAMBL",TypeOfInvestment = "Stocks", Worth = 387050 }, 
       new Element { Company = "QUASLCOMM INC",TypeOfInvestment = "Bonds", Worth = 196811 }, 
       new Element { Company = "UTD TECHS CORP",TypeOfInvestment = "Bonds", Worth = 257429 }, 
       new Element { Company = "WELLS FARGO-NEW",TypeOfInvestment = "Bank Account", Worth = 106600 }, 
       new Element { Company = "FEDEX CORP",TypeOfInvestment = "Stocks", Worth = 103955 }, 
       new Element { Company = "CVS CAREMARK CP",TypeOfInvestment = "Securities", Worth = 171048 }, 
      }; 

      //Group by on multiple column in LINQ (Query Method) 
      var query = from e in elements 
         group e by new{e.TypeOfInvestment,e.Company} into eg 
         select new {eg.Key.TypeOfInvestment, eg.Key.Company, Points = eg.Sum(rl => rl.Worth)}; 



      foreach (var item in query) 
      { 
       Console.WriteLine(item.TypeOfInvestment.PadRight(20) + " " + item.Points.ToString()); 
      } 


      //Group by on multiple column in LINQ (Lambda Method) 
      var CompanyDetails =elements.GroupBy(s => new { s.Company, s.TypeOfInvestment}) 
           .Select(g => 
              new 
              { 
               company = g.Key.Company, 
               TypeOfInvestment = g.Key.TypeOfInvestment,    
               Balance = g.Sum(x => Math.Round(Convert.ToDecimal(x.Worth), 2)), 
              } 
            ); 
      foreach (var item in CompanyDetails) 
      { 
       Console.WriteLine(item.TypeOfInvestment.PadRight(20) + " " + item.Balance.ToString()); 
      } 
      Console.ReadLine(); 

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