আইগ্রুপিং থেকে মান কীভাবে পাবেন


211

আমি IGroupingএবং Select()পদ্ধতি সম্পর্কে একটি প্রশ্ন আছে ।

ধরা যাক আমি IEnumerable<IGrouping<int, smth>>এইভাবে একটি পেয়েছি :

var groups = list.GroupBy(x => x.ID);

যেখানে listএকটি হল List<smth>

এবং এখন আমার IGroupingকিছু মান অন্যভাবে অন্য তালিকায় পাস করতে হবে :

foreach (var v in structure)
{
    v.ListOfSmth = groups.Select(...); // <- ???
}

এই জাতীয় প্রসঙ্গে একটি List<smth>থেকে কীভাবে মানগুলি ( ) পাওয়া যায় তা কি কেউ পরামর্শ দিতে পারে IGrouping<int, smth>?


আইডি হ'ল একটি পরিচয় ক্ষেত্র যা অনন্য হওয়া উচিত, যা এটির দ্বারা গোষ্ঠীকরণকে অকেজো করে তুলবে, যদি আপনি কেবল সদৃশ ডেটা অপসারণের চেষ্টা করছেন তার পরিবর্তে ডিস্টিন্ট () চেষ্টা করুন try যদি এটি তালিকাভুক্ত হয় rouগ্রুপবি (x => x.SubID) তাহলে গ্রুপিংটি ব্যবহার করা বুদ্ধিমান হবে তবে সেই ক্ষেত্রে আপনি সম্ভবত গ্রুপিং এবং ফোরচ (গ্রুপগুলিতে var grp) রাখতে চান want grp.ToList () ;
that

উত্তর:


277

যেহেতু IGrouping<TKey, TElement>কার্যকরী IEnumerable<TElement>, আপনি ব্যবহার করতে পারেন SelectManyসব লাগাতে IEnumerablesএক ফিরে IEnumerableসব একসাথে:

List<smth> list = new List<smth>();
IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.id);
IEnumerable<smth> smths = groups.SelectMany(group => group);
List<smth> newList = smths.ToList();

3
এটি কি সাধারণ "অর্ডার বাই" এর মতো নয়? <smth> newList = list .OrderBy (x => x.id) .ToList ();
মরগোজ

মোরগোজেড, প্রশ্নটি groupsএকটি ফ্ল্যাট তালিকায় নেওয়া এবং ফিরে পাওয়ার বিষয়ে।
ম্যাট স্মিথ

3
@ মোরগোজেড, OrderBy(x => x.id)তাদের আইডির মাধ্যমে আরোহী ক্রম অনুসারে বাছাই করবে। এর সাথে বৈসাদৃশ্য করুন .GroupBy(x => x.id).SelectMany(group => group), যা তাদের আইডির প্রথম উপস্থিতির ক্রম অনুসারে বাছাই করবে। যদি মূল আইডিগুলি ক্রমে থাকে: [1,3,2,2,2,3,0], তারপরে তাদের গোষ্ঠীভুক্ত করা এবং তারপরে একটি তালিকায় ফ্ল্যাট করা নতুন আইডিতে আইডি রাখবে: [1,3,3, 2,2,2,0]।
পাই ফিশার

2
এটি আমার পক্ষে কাজ করে না .. এটি বলে যে প্রকারটি ব্যবহারের মাধ্যমে অনুমান করা যায় না
রিসিয়ার

3
ধরণের ব্যবহার দ্বারা অনুমান করা যায় না
লিও গুরুদিয়ান

34
foreach (var v in structure) 
{     
    var group = groups.Single(g => g.Key == v. ??? );
    v.ListOfSmth = group.ToList();
}

প্রথমে আপনাকে পছন্দসই গ্রুপ নির্বাচন করতে হবে। তারপরে আপনি ToListগ্রুপটিতে পদ্ধতিটি ব্যবহার করতে পারেন । IGroupingএকটি হল IEnumerableমূল্যবোধের।


17

উপরের উত্তরগুলির আরও স্পষ্ট বর্ণিত সংস্করণ:

IEnumerable<IGrouping<int, ClassA>> groups = list.GroupBy(x => x.PropertyIntOfClassA);

foreach (var groupingByClassA in groups)
{
    int propertyIntOfClassA = groupingByClassA.Key;

    //iterating through values
    foreach (var classA in groupingByClassA)
    {
        int key = classA.PropertyIntOfClassA;
    }
}

আমি তাই মনে করি না, অন্তত এখন জন্য।
SNR

15

আইগ্রুপিংয়ের সংজ্ঞা থেকে:

IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable

আপনি কেবল এই জাতীয় উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে পারেন:

IEnumerable<IGrouping<int, smth>> groups = list.GroupBy(x => x.ID)
foreach(IEnumerable<smth> element in groups)
{
//do something
}

1
যা তার মাধ্যমে পুনরাবৃত্তি করে গ্রুপে আইটেমগুলি নয়
মাইকটি

1
ওহ আমার ভুল, তারপরে: 'ফরচ (গ্রুপে স্মেথ পি। সিলেক্টম্যানি (sth => sth))'
ইউজার 1275513
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.