2013-09-02 4 views
20

मैं एक वस्तु हैसमूह के लिए वस्तुओं की एक सूची LINQ का उपयोग करना

List<Customer> CustomerList = new List<Customer>(); 
CustomerList.Add(new Customer { ID = 1, Name = "One", GroupID = 1 }); 
CustomerList.Add(new Customer { ID = 2, Name = "Two", GroupID = 1 }); 
CustomerList.Add(new Customer { ID = 3, Name = "Three", GroupID = 2 }); 
CustomerList.Add(new Customer { ID = 4, Name = "Four", GroupID = 1 }); 
CustomerList.Add(new Customer { ID = 5, Name = "Five", GroupID = 3 }); 
CustomerList.Add(new Customer { ID = 6, Name = "Six", GroupID = 3 }); 

मैं एक LINQ क्वेरी लौटना चाहते जो होगा देखो

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

जैसे मैं

से करने की कोशिश की

Using Linq to group a list of objects into a new grouped list of list of objects

कोड

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

काम करता है लेकिन वांछित आउटपुट नहीं देता है।

+0

की [एक नए समूह में वस्तुओं की एक सूची समूह को LINQ का उपयोग संभावित डुप्लिकेट ऑब्जेक्ट्स की सूची की एड सूची] (http://stackoverflow.com/questions/2697253/using-linq-to-group-a-list-of-objects-into-a-new-grouped-list-of-list- की-वस्तुओं) – scar80

उत्तर

1

क्या आप चाहते हैं?

var grouped = CustomerList.GroupBy(m => m.GroupID).Select((n) => new { GroupId = n.Key, Items = n.ToList() }); 
51
var groupedCustomerList = CustomerList.GroupBy(u => u.GroupID) 
             .Select(grp =>new { GroupID =grp.Key, CustomerList = grp.ToList()}) 
             .ToList(); 
4
var groupedCustomerList = CustomerList 
         .GroupBy(u => u.GroupID, u=>{ 
                 u.Name = "User" + u.Name; 
                 return u; 
                }, (key,g)=>g.ToList()) 
         .ToList(); 

आप मूल डेटा को बदलने के लिए नहीं करना चाहते हैं, तो आप इस तरह अपने वर्ग के लिए कुछ विधि जोड़ने (क्लोन की तरह और संशोधित) करना चाहिए:

public class Customer { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
    public Customer CloneWithNamePrepend(string prepend){ 
    return new Customer(){ 
      ID = this.ID, 
      Name = prepend + this.Name, 
      GroupID = this.GroupID 
    }; 
    } 
}  
//Then 
var groupedCustomerList = CustomerList 
         .GroupBy(u => u.GroupID, u=>u.CloneWithNamePrepend("User"), (key,g)=>g.ToList()) 
         .ToList(); 

मुझे लगता है कि आप मूल डेटा को संशोधित किए बिना Customer प्रदर्शित कर सकते हैं। यदि ऐसा है तो आपको चाहिए डिजाइन अपनी कक्षा Customer अलग ढंग से, इस तरह:

public class Customer { 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
    public string Prefix {get;set;} 
    public string FullName { 
    get { return Prefix + Name;} 
    }    
} 
//then to display the fullname, just get the customer.FullName; 
//You can also try adding some override of ToString() to your class 

var groupedCustomerList = CustomerList 
         .GroupBy(u => {u.Prefix="User", return u.GroupID;} , (key,g)=>g.ToList()) 
         .ToList(); 
0

वांछित परिणाम IGrouping, जो वस्तुओं इस मामले एक GroupID

में एक आम कुंजी है का एक संग्रह का प्रतिनिधित्व करता है का उपयोग कर प्राप्त किया जा सकता
var newCustomerList = CustomerList.GroupBy(u => u.GroupID) 
                .Select(group => new { GroupID = group.Key, Customers = group.ToList() }) 
                .ToList(); 
3
var groupedCustomerList = CustomerList 
.GroupBy(u => u.GroupID) 
.Select(g => new 
      { 
       GroupId = g.Key, 
       Items = g.Select(i => new 
       { 
        UserID = i.ID, 
        UserName = string.Concat("User", i.Name), 
        GroupId = i.GroupID 
       }).ToList() 
      }) 
.ToList(); 
0
var result = from cx in CustomerList 
     group cx by cx.GroupID into cxGroup 
    orderby cxGroup.Key 
    select cxGroup; 

foreach (var cxGroup in result) { 
Console.WriteLine(String.Format("GroupID = {0}", cxGroup.Key)); 
    foreach (var cx in cxGroup) { 
    Console.WriteLine(String.Format("\tUserID = {0}, UserName = {1}, GroupID = {2}", 
     new object[] { cx.ID, cx.Name, cx.GroupID })); 
    } 
} 
संबंधित मुद्दे