2013-09-02 16 views
20

のリスト:私は次のように見えるかもしれリストを返す私はオブジェクト持つオブジェクト

public class Customer 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int GroupID { get; set; } 
} 

を:

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

[の可能性のある重複オブジェクトの一覧の編集リスト](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と異なるように表示することをお勧めします。

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

所望の結果は、この場合にGroupID

を共通鍵を持っているオブジェクトのコレクションを表し IGroupingを使用して取得することができます。もしそうなら、あなたは このような異なったデザインクラス Customerをすべき新しいグループにグループ化するオブジェクトのリストをLINQのを使用して
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 })); 
    } 
} 
関連する問題