গ্রুপবাই এবং গণনা সহ লাইনকিউ


220

এটি বেশ সহজ তবে আমার ক্ষতি হচ্ছে: এই জাতীয় ডেটা সেট দেওয়া:

UserInfo(name, metric, day, other_metric)

এবং এই নমুনা ডেটা সেট:

joe  1 01/01/2011 5
jane 0 01/02/2011 9
john 2 01/03/2011 0
jim  3 01/04/2011 1
jean 1 01/05/2011 3
jill 2 01/06/2011 5
jeb  0 01/07/2011 3
jenn 0 01/08/2011 7

আমি একটি টেবিলটি পুনরুদ্ধার করতে চাই যা গণনাটি সংখ্যার ক্রমানুসারে (0,1,2,3 ..) তালিকাভুক্ত করে count সুতরাং এই সেট থেকে আপনি শেষ করতে চাই:

0 3    
1 2    
2 2    
3 1

আমি লিনকিউ সিনট্যাক্সের সাথে ঝাঁপিয়ে পড়েছি কিন্তু কোথায় আছি তাতে গ্রুপবাই রেখে গণনা করব .... কোন সাহায্য ??

পোস্ট সম্পাদনা করুন: পোস্টের উত্তরগুলি কাজ করতে আমি কখনই সক্ষম হইনি কারণ তারা সর্বদা বিভিন্ন গণনার সংখ্যার সাথে একটি রেকর্ড ফিরিয়ে দেয়। তবে আমি এসকিউএল উদাহরণের সাথে একটি লাইনকিউ একসাথে রাখতে সক্ষম হয়েছি যা কাজ করেছে:

        var pl = from r in info
                 orderby r.metric    
                 group r by r.metric into grp
                 select new { key = grp.Key, cnt = grp.Count()};

এই ফলাফলটি আমাকে 'ম্যাট্রিক্স' এবং প্রতিটিটির সাথে যুক্ত ব্যবহারকারীর সংখ্যা সহ রেকর্ডের একটি আদেশকৃত সেট দিয়েছে। আমি সাধারণভাবে লিনকিউ-তে স্পষ্টতই নতুন এবং আমার প্রশিক্ষণপ্রাপ্ত চোখের কাছে এই পদ্ধতিকে খাঁটি লিনকিউ পদ্ধতির সাথে অনেকটা সাদৃশ্য বলে মনে হচ্ছে তবুও আমাকে আলাদা উত্তর দিয়েছে।


হ্যাঁ আমার আছে, তবে জিমির ব্যাখ্যা আমাকে আরও বেশি সাহায্য করেছে। তবে আমি তার উদাহরণটি কখনও কাজ করতে সক্ষম হইনি তবে এটি আমাকে একটি নতুন দিকে নিয়ে গেছে।
জিও

@ জিমি স্ট্যান্ডার্ড লিনকিউ কোয়েরি সিনট্যাক্সের পরিবর্তে লিনকিউ এক্সপ্রেশনগুলির জন্য ক্রিয়ামূলক বাক্য গঠন ব্যবহার করেছেন, এবং তিনি স্থগিত সম্পাদনের বিন্যাসের চেয়ে এই ফাংশনগুলির তাত্ক্ষণিক সম্পাদন দেখানোর সিদ্ধান্ত নিয়েছিলেন। একটি নতুন ব্যক্তির জন্য যা বিভ্রান্তিকর হবে। কেন যে সে জানল না।
রিচার্ড রবার্টসন

উত্তর:


393

কল করার পরে GroupBy, আপনি একটি গ্রুপের একটি সিরিজ পান IEnumerable<Grouping>, যেখানে প্রতিটি গোষ্ঠীবদ্ধতা নিজেই Keyগোষ্ঠীটি তৈরির জন্য উদ্ভাসিত করে IEnumerable<T>এবং আপনার মূল ডেটা সেটে যা কিছু আইটেম থাকে তার একটি । Count()সাবটোটোটাল পেতে আপনাকে কেবল সেই গ্রুপিংয়ে কল করতে হবে।

foreach(var line in data.GroupBy(info => info.metric)
                        .Select(group => new { 
                             Metric = group.Key, 
                             Count = group.Count() 
                        })
                        .OrderBy(x => x.Metric)
{
     Console.WriteLine("{0} {1}", line.Metric, line.Count);
}


এটি একটি চমত্কারভাবে দ্রুত উত্তর ছিল তবে আমি প্রথম পংক্তিতে কিছুটা সমস্যা নিয়েছি, বিশেষত "ডেটা.groupby (তথ্য => তথ্য.মেট্রিক)"

আমি তোমাদের ইতিমধ্যে কিছু একটি তালিকা / অ্যারে আছে অভিমানী করছি classযে মত দেখাচ্ছে

class UserInfo {
    string name;
    int metric;
    ..etc..
} 
...
List<UserInfo> data = ..... ;

আপনি যখন করেন data.GroupBy(x => x.metric), এর অর্থ হল " xনির্ধারিত আইনিউমেন্টেবলের প্রতিটি উপাদানটির জন্য dataএটি গণনা করুন .metric, তারপরে একই মেট্রিকের সাথে সমস্ত উপাদানকে গোষ্ঠীভুক্ত করুন Groupingএবং IEnumerableফলস্বরূপ সমস্ত গোষ্ঠীর একটি ফিরিয়ে দিন your

    <DATA>           | Grouping Key (x=>x.metric) |
joe  1 01/01/2011 5  | 1
jane 0 01/02/2011 9  | 0
john 2 01/03/2011 0  | 2
jim  3 01/04/2011 1  | 3
jean 1 01/05/2011 3  | 1
jill 2 01/06/2011 5  | 2
jeb  0 01/07/2011 3  | 0
jenn 0 01/08/2011 7  | 0

এটি গ্রুপবাইয়ের পরে নিম্নলিখিত ফলাফল হতে পারে:

(Group 1): [joe  1 01/01/2011 5, jean 1 01/05/2011 3]
(Group 0): [jane 0 01/02/2011 9, jeb  0 01/07/2011 3, jenn 0 01/08/2011 7]
(Group 2): [john 2 01/03/2011 0, jill 2 01/06/2011 5]
(Group 3): [jim  3 01/04/2011 1]

এটি একটি উজ্জ্বল দ্রুত উত্তর ছিল তবে আমি প্রথম পংক্তিতে বিশেষত "ডেটা.groupby (তথ্য => তথ্য.মেট্রিক)" নিয়ে কিছুটা সমস্যা নিয়ে আসছি। সরলভাবে 'ডেটা' বর্তমানে ডেটা সেট করা হয় তবে 'তথ্য.মেট্রিক' কী নিন্দা করে? ক্লাস সংজ্ঞা?
জিও

"তথ্য.মেট্রিক" হ'ল আপনার প্রশ্নটিতে আপনি উল্লিখিত ইউজারআইফোন ক্লাসের মেট্রিক সম্পত্তি / ক্ষেত্র।
লী-এম

1
ধন্যবাদ বুঝতে পেরেছি তবে বাস্তবে এটি আমাকে একক মান দেয় - যথা বিভিন্ন মেট্রিক গনের মোট সংখ্যা। এই উদাহরণে আমি "মেট্রিক্স 4" পাই যা আমার কাছে ইঙ্গিত দেয় যে আমার কাছে কতগুলি পৃথক গণনা রয়েছে।
জিও

1
কি দারুন. আপনি সম্পূর্ণ গ্রুপিং ব্যাখ্যা করেছেন !! এটি একাই পোস্টটির পক্ষে মূল্যবান ছিল .... আমি "মেট্রিক 4" ফলাফলটি পেয়েছি তবে ধন্যবাদ!
জিও

4
এই উত্তরের সূচনা, "গ্রুপবাইয়ের কল করার পরে, আপনি একাধিক গোষ্ঠী আইয়ুনামেবল <গ্রুপিং> পাবেন, যেখানে প্রতিটি গোষ্ঠীকরণ নিজেই গোষ্ঠীটি তৈরি করার জন্য ব্যবহৃত কীটি প্রকাশ করে এবং আপনার মূল ডেটাতে থাকা আইটেমগুলির মধ্যে একটি আইনেউমেন্টাল <T> থাকে সেট ", লিনকিউ গ্রুপের স্পষ্ট ব্যাখ্যা যা আমি এখনও পড়েছি, আপনাকে ধন্যবাদ।
ডুম্বলডেড

48

ধরে userInfoListনেওয়া একটি List<UserInfo>:

        var groups = userInfoList
            .GroupBy(n => n.metric)
            .Select(n => new
            {
                MetricName = n.Key,
                MetricCount = n.Count()
            }
            )
            .OrderBy(n => n.MetricName);

ল্যাম্বডা ফাংশনটির জন্য GroupBy(), n => n.metricএটির মুখোমুখি metricহওয়া প্রতিটি UserInfoবস্তুর ক্ষেত্র পাবে । প্রকারের nভিত্তিতে প্রকারের উপর নির্ভর করে, প্রথমবারের মতো এটি টাইপ করে UserInfo, কারণ তালিকায় UserInfoঅবজেক্ট থাকে। দ্বিতীয় সংঘটনে nধরনের হয় Grouping, কারণ এটি এখন হল তার একটি তালিকা Groupingবস্তু।

Groupingগুলি মত এক্সটেনশন পদ্ধতি আছে .Count(), .Key()এবং বেশ কিছুর আপনি আশা করবে। আপনি যেমনটি পরীক্ষা .Lenghtকরে দেখুন ঠিক তেমনই আপনি একটি গ্রুপও পরীক্ষা stringকরতে পারেন .Count()


23
userInfos.GroupBy(userInfo => userInfo.metric)
        .OrderBy(group => group.Key)
        .Select(group => Tuple.Create(group.Key, group.Count()));

1
ছোট টাইপ -> group.keyনির্বাচন (...) এ অবশ্যই হতে হবেgroup.Key
জানুয়ারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.