Linq का उपयोग वस्तुओं की सूची की एक नई समूहीकृत सूची में वस्तुओं की सूची बनाने के लिए


149

मुझे नहीं पता कि क्या यह लिनक में संभव है लेकिन यहाँ जाता है ...

मेरे पास एक वस्तु है:

public class User
{
  public int UserID { get; set; }
  public string UserName { get; set; }
  public int GroupID { get; set; }
}

मैं एक सूची देता हूं जो निम्नलिखित की तरह दिख सकती है:

List<User> userList = new List<User>();
userList.Add( new User { UserID = 1, UserName = "UserOne", GroupID = 1 } );
userList.Add( new User { UserID = 2, UserName = "UserTwo", GroupID = 1 } );
userList.Add( new User { UserID = 3, UserName = "UserThree", GroupID = 2 } );
userList.Add( new User { UserID = 4, UserName = "UserFour", GroupID = 1 } );
userList.Add( new User { UserID = 5, UserName = "UserFive", GroupID = 3 } );
userList.Add( new User { UserID = 6, UserName = "UserSix", GroupID = 3 } );

मैं उपरोक्त सूची पर एक Linq क्वेरी चलाने में सक्षम होना चाहता हूं जो GroupID द्वारा सभी उपयोगकर्ताओं को समूहित करता है। तो आउटपुट उपयोगकर्ता सूचियों की एक सूची होगी जिसमें उपयोगकर्ता होता है (यदि यह समझ में आता है?)। कुछ इस तरह:

GroupedUserList
    UserList
        UserID = 1, UserName = "UserOne", GroupID = 1
        UserID = 2, UserName = "UserTwo", GroupID = 1
        UserID = 4, UserName = "UserFour", GroupID = 1
    UserList
        UserID = 3, UserName = "UserThree", GroupID = 2
    UserList
        UserID = 5, UserName = "UserFive", GroupID = 3
        UserID = 6, UserName = "UserSix", GroupID = 3

मैंने ग्रुपबी लाइनक क्लॉज का उपयोग करने की कोशिश की है, लेकिन यह कुंजी की सूची और इसके सही तरीके से समूहीकृत नहीं होने पर वापस लौटा लगता है:

var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();

जवाबों:


309
var groupedCustomerList = userList
    .GroupBy(u => u.GroupID)
    .Select(grp => grp.ToList())
    .ToList();

1
बहुत अच्छा, बस मुझे जो चाहिए था। धन्यवाद। यह अनिवार्य तरीका बेकार है।
user1841243

1
क्या यह ठीक काम कर रहा है? क्योंकि मैं इस तरीके का उपयोग कर रहा हूँ काम नहीं किया। objModel.tblDonars.GroupBy (t => new {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}) का चयन करें (g = new = tblDonar = g.ToList ()})। ToList () ); यह काम नहीं कर रहा है ... क्या आप मदद कर सकते हैं ....
राजामोहन एंगुचामी

आपके समाधान के साथ यह ठीक है, लेकिन मेरा एक सवाल है कि समूह में 8 मान तक है और मुझे हर समूह में सिर्फ 6 लेने की आवश्यकता है इसलिए मैं यह कैसे कर सकता हूं कि कृपया मुझे बताएं।
कोडरविल

क्या GroupID द्वारा समूहीकरण के बाद अलग-अलग UserNames और UserID को सूचीबद्ध करने का एक तरीका है? जैसे - {"1", [1, 2, 4], ["UserOne", "UserTwo", "UserFour"]} के लिए} groupID 1.
अजय

1
यदि आप इसे पिछले प्रकार की सूची में डालने का प्रयास करते हैं तो वर्तमान में कोड काम नहीं करता है और एक त्रुटि का कारण बनता है। क्योंकि चयन सूची में वापस लौटने से सूची के अंदर एक सूची बन जाती है जो यहां वांछित आउटपुट नहीं है। जिन लोगों को समस्या है उनके लिए मैं सुझाव दे सकता हूं: var groupedCustomerList = userList.GroupBy (u => u.GroupID) .Select (grp => grp.First ())। ToList ()।
एलियास

36

आपका समूह विवरण समूह आईडी द्वारा समूहित होगा । उदाहरण के लिए, यदि आप लिखते हैं:

foreach (var group in groupedCustomerList)
{
    Console.WriteLine("Group {0}", group.Key);
    foreach (var user in group)
    {
        Console.WriteLine("  {0}", user.UserName);
    }
}

यह ठीक काम करना चाहिए। प्रत्येक समूह के पास एक कुंजी होती है, लेकिन इसमें IGrouping<TKey, TElement>एक संग्रह भी होता है जो आपको समूह के सदस्यों पर पुनरावृति करने की अनुमति देता है। जैसा कि ली उल्लेख करते हैं, यदि आप वास्तव में चाहते हैं, तो आप प्रत्येक समूह को एक सूची में बदल सकते हैं, लेकिन यदि आप ऊपर दिए गए कोड के अनुसार उन पर पुनरावृति करने जा रहे हैं, तो ऐसा करने में कोई वास्तविक लाभ नहीं है।


4

प्रकार के लिए

public class KeyValue
{
    public string KeyCol { get; set; }
    public string ValueCol { get; set; }
}

संग्रह

var wordList = new Model.DTO.KeyValue[] {
    new Model.DTO.KeyValue {KeyCol="key1", ValueCol="value1" },
    new Model.DTO.KeyValue {KeyCol="key2", ValueCol="value1" },
    new Model.DTO.KeyValue {KeyCol="key3", ValueCol="value2" },
    new Model.DTO.KeyValue {KeyCol="key4", ValueCol="value2" },
    new Model.DTO.KeyValue {KeyCol="key5", ValueCol="value3" },
    new Model.DTO.KeyValue {KeyCol="key6", ValueCol="value4" }
};

हमारी linq क्वेरी नीचे की तरह दिखती है

var query =from m in wordList group m.KeyCol by m.ValueCol into g
select new { Name = g.Key, KeyCols = g.ToList() };

या नीचे की तरह सूची के बजाय सरणी के लिए

var query =from m in wordList group m.KeyCol by m.ValueCol into g
select new { Name = g.Key, KeyCols = g.ToList().ToArray<string>() };

-1

अभी भी एक पुराना है, लेकिन ली के जवाब ने मुझे समूह नहीं दिया। परिणाम के रूप में। इसलिए, मैं एक सूची को समूहीकृत करने और एक समूहीकृत सूची वापस करने के लिए निम्नलिखित कथन का उपयोग कर रहा हूं:

public IOrderedEnumerable<IGrouping<string, User>> groupedCustomerList;

groupedCustomerList =
        from User in userList
        group User by User.GroupID into newGroup
        orderby newGroup.Key
        select newGroup;

प्रत्येक समूह के पास अब एक कुंजी है, लेकिन इसमें एक IGrouping भी है जो एक संग्रह है जो आपको समूह के सदस्यों पर पुनरावृति करने की अनुमति देता है।


यह आपके सवाल का जवाब देता है , ओपी के सवाल का नहीं। वे केवल सूचियों की सूची चाहते हैं। आपका कोड वह प्रदान नहीं करता है।
गर्ट अर्नोल्ड

मैंने इस समाधान को पोस्ट किया है क्योंकि @Lee से ऊपर का स्वीकृत उत्तर तब काम नहीं करता है जब iterating करता है क्योंकि यह तत्व प्रदान नहीं करता है group.keyजब @JohnSkeet द्वारा उत्तर में दर्शाई गई समूह सूची के माध्यम से पुनरावृत्ति करता है। मेरा प्रदान किया गया उत्तर पुनरावृत्ति करते समय group.key तत्व प्रदान करता है । तो यह अन्य गिर में मदद कर सकता है कि प्रदान किए गए उत्तर ऊपर दिखाए गए अनुसार काम नहीं करते हैं। तो यह स्वीकृत उत्तर के समान Group.key तत्व प्राप्त करने के लाभ के साथ सूची प्राप्त करने का एक और तरीका है। अपने दावे को समझें @GertArnold (.net कोर 3.0)
डेटापूल

मुझे लगता है कि पूरा प्रश्न यह समझने की कमी पर आधारित है कि क्या IGroupingहै। यही कारण है कि ओपी नीचे अपने स्वयं के सही कोड को छोड़ देता है, जो अनिवार्य रूप से आपके कोड के समान है। इसलिए वे एक उत्तर को स्वीकार करते हैं जो वही प्रदान करता है जो वे मांगते हैं। उन्हें क्या जरूरत है, एक स्पष्टीकरण, जिसे जेएस ने पर्याप्त रूप से प्रदान किया है।
गर्ट अर्नोल्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.