ল্যাম্বদা ব্যবহার করে একাধিক কলাম দিয়ে গ্রুপ করুন


122

ল্যাম্বডা ব্যবহার করে আমি কীভাবে একাধিক কলামগুলি দিয়ে গ্রুপ করব?

সত্তাগুলিতে লিনক ব্যবহার করে এটি কীভাবে করা যায় তার উদাহরণ আমি দেখেছি, তবে আমি ল্যাম্বদা ফর্মটি খুঁজছি।

উত্তর:


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

এটি কি আসলে কাজ করবে? আমি মনে করব যে আপনি যে প্রতিটি বস্তুর দ্বারা দলবদ্ধ করছেন তার সমতা পরীক্ষা ব্যর্থ হবে যেহেতু তারা বস্তু এবং স্ট্রাক্ট নয়।
জ্যাকব

@ আডাকি: ধন্যবাদ আপনি উদাহরণস্বরূপ বলতে পারেন কীভাবে আমি গ্রুপ আইটেমগুলির অনুমানযোগ্য পেতে পারি?
নাওর

6
@ জ্যাকব - বেনামে প্রকারগুলি হ'ল যথাযথভাবে ওভাররাইড GetHashCodeএবং Equalsপদ্ধতিগুলির সাথে অবিচ্ছেদ্য শ্রেণি । তারা যেখানে ব্যবহারের ক্ষেত্রে ঠিক এই ধরণের জন্য নকশাকৃত।
শত্রুতা

5
@ নাওর - এটি GroupByএকটি অভ্যন্তরীণ গণনার উপর সম্পত্তি সহ একটি IEnumerable<IGrouping<TKey, TSource>>যা মূলত একটি প্রদান IEnumerable<IEnumerable<TSource>>করে Key। এটি কী আপনাকে গ্রুপ আইটেমগুলির "আইনিউমারেবল" পেতে সহায়তা করে?
igগিরিভিটি

আমার 'উত্স' ভেরিয়েবল যদি অভিধান সংগ্রহ হয় এটি কাজ করে না। পরামর্শ?
জোয়াও পাওলো

6

যদি আপনার টেবিলটি এমন হয়

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

6
এটি লক্ষ্য করা খুব জরুরি যে AsEnumerable পুরো টেবিলটিকে গ্রুপিংয়ের আগে স্মৃতিতে আনবে। এটি অবশ্যই কিছু টেবিলে গুরুত্বপূর্ণ। আরও অন্তর্দৃষ্টি জন্য এই উত্তরটি দেখুন: stackoverflow.com/questions/17968469/…
ব্র্যান্ডন বার্কলে

4

এগিয়ে নিয়ে যাওয়ার 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();

যেখানে গ্রাহকগ্রুপিংকি গ্রুপ কীগুলি গ্রহণ করে:

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

        public string Country { get; }

        public string Gender { get; }
    }

1
সম্ভবত কাউকে কিছুটা সময় সাশ্রয় হবে: অবজেক্ট ইনিশিয়েলজিটারগুলির সাথে ডিফল্ট নির্মাণগুলি ব্যবহার করা আরও ভাল। উপরের নমুনা কোডের পদ্ধতির সাথে ORF গুলি EF কোরের মতো আচরণ করবে না
কনস্টান্টিন

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

        }
    }

1

আমি ডেভিডের উত্তরের মতো ক্লাস সংজ্ঞায়িত করার মিশ্রণ নিয়ে এসেছি, তবে ক্লাসটি এর সাথে যাওয়ার দরকার নেই। দেখে মনে হচ্ছে এটির মতো:

var resultsGroupings = resultsRecords.GroupBy(r => new { r.IdObj1, r.IdObj2, r.IdObj3})
                                    .Select(r => new ResultGrouping {
                                        IdObj1= r.Key.IdObj1,
                                        IdObj2= r.Key.IdObj2,
                                        IdObj3= r.Key.IdObj3,
                                        Results = r.ToArray(),
                                        Count = r.Count()
                                    });



private class ResultGrouping
        {
            public short IdObj1{ get; set; }
            public short IdObj2{ get; set; }
            public int IdObj3{ get; set; }

            public ResultCsvImport[] Results { get; set; }
            public int Count { get; set; }
        }

resultRecordsআমার প্রাথমিক তালিকাটি আমি কোথায় গ্রুপ করছি, এবং এটির একটি List<ResultCsvImport>। মনে রাখবেন যে এখানে ধারণাটি হ'ল, আমি 3 টি কলাম, আইডোবিজে 1 এবং আইডোবিজে 2 এবং আইডোবিজে 3 দিয়ে গ্রুপ করছি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.