2017-01-05 3 views
0

私はLinqを初めて使っています。私は以下のようなシナリオがあります。団体名Linq + C#

class Program 
{ 
    static void Main(string[] args) 
    { 

     var address = new List<Address>(); 
     address.Add(new Address { AddressLine = "Address 1", City = "City 1", State = "State 1", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 1 Dup", City = "City 1", State = "State 1", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 2", City = "City 2", State = "State 2", UserId = 2 }); 
     address.Add(new Address { AddressLine = "Address 2 Dup", City = "City 2", State = "State 2", UserId = 2 }); 
     address.Add(new Address { AddressLine = "Address 3", City = "City 3", State = "State 3", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 3 Dup", City = "City 3", State = "State 3", UserId = 1 }); 

     var users = new List<User>(); 
     users.Add(new User { Id = 1, Name = "User 1", NickName = "user 1", Address = address }); 
     users.Add(new User { Id = 2, Name = "User 1", NickName = "user 2", Address = address }); 
     users.Add(new User { Id = 3, Name = "User 2", NickName = "user 3", Address = address }); 
     users.Add(new User { Id = 4, Name = "User 2", NickName = "user 4", Address = address }); 
    } 
} 

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Address> Address { get; set; } 
    public string NickName { get; set; } 
} 

public class Address 
{ 
    public string AddressLine { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 

    public int UserId { get; set; } 
} 

私はユーザー名でリストをグループ化したいので、上記の例のアドレスの最初の2つの名前user1のオブジェクトを1つのオブジェクトにマージする必要があります。両方のオブジェクトのアドレスは1にマージする必要があります。

+0

だから、アドレスリストと、各ユーザーに返す必要がありますか? – Frogger

+1

マージはどのように表示されますか? "Address 1" + "Address 1 Dup" = "Address 1Address 1 Dup"、またはアドレスの長さが長いアドレスを取る?または "AAddddrreessss 11 Dup" _(マージ)_? – SynerCoder

答えて

2

あなただけのマージされたユーザーのためのアドレスリストを連結する必要がある場合は、このLINQはそれを行うだろう。

var mergedUsers = 
    from user in users 
    group user by user.Name 
    into newGroup 
    let baseUser = newGroup.First() 
    select new User 
    { 
     Id = baseUser.Id, 
     Name = baseUser.Name, 
     NickName = baseUser.NickName, 
     Address = newGroup.SelectMany(u => u.Address).ToList() 
    }; 

このコードはまた、NickNameIdなどのマージされたユーザーのための他のプロパティは、(等しいすなわち)一致していることを前提としてい。値は、マージリストの最初のユーザーから取得されます。

1

は、次の試してみてください。

  var results = users.GroupBy(x => x.Name).Select(x => new 
      { 
       ids = x.Select(y => y.Id).ToList(), 
       nicNames = x.Select(y => y.NickName).ToList(), 
       addresses = x.Select(y => new { addresses = address.Where(z => z.UserId == y.Id) }).SelectMany(a => a.addresses).ToList() 
      }).ToList();