2017-01-05 1 views
0

Ich bin neu bei Linq, ich habe folgendes Szenario.Gruppe nach Name 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; } 
} 

Ich mag Gruppe Benutzerklasse Liste von Benutzername, so dass, wenn Adresse für obiges Beispiel zuerst zwei Objekt mit dem Namen Benutzer1 sollte in ein Objekt zusammengefügt werden. Die Adresse des Objekts sollte zu einem Objekt zusammengeführt werden.

+0

So soll es jeden Benutzer mit einer Adressliste zurückkehren? – Frogger

+1

Wie sehen Sie die Zusammenführung? "Adresse 1" + "Adresse 1 Dup" = "Adresse 1 Adresse 1 Dup", oder die Adressen mit der überzähligen Adresszeile nehmen? Oder "AAddddrreessss 11 Dup" _ (zusammengeführt) _? – SynerCoder

Antwort

2

Wenn Sie gerade benötigen Adresslisten für fusionierte Benutzer verketten, dann wird dies LINQ es tun:

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() 
    }; 

Dieser Code geht davon aus, dass auch andere Eigenschaften für fusionierte Benutzer wie NickName und Id konsistent sind (dh gleich) . Die Werte werden vom ersten Benutzer in der Zusammenführungsliste übernommen.

1

Versuche folgende:

  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();