2012-06-27 1 views
4

Dire que j'ai une simple classe d'adresse comme ci-dessous:Groupe par clé et envoyer des valeurs dans la liste en utilisant LINQ

public class Address 
{ 
    public int AddressId { get; set; } 
    public List<int> NodeIds { get; set; } 
} 

et ont peuplé une liste d'adresses comme ci-dessous:

List<Address> listOfAddresses = new List<Address> 
{ 
    new Address {AddressId=1, NodeIds=new List<int>{1}}, 
    new Address {AddressId=2, NodeIds=new List<int>{2}}, 
    new Address {AddressId=3, NodeIds=new List<int>{3}}, 
    new Address {AddressId=1, NodeIds=new List<int>{4}}, 
    new Address {AddressId=1, NodeIds=new List<int>{5}} 
} 

et je veux Pour regrouper par sur AddressIds de sorte que la liste de résultats aura NodeIds qui sont essentiellement enroulés en cas de doublons comme ci-dessous:

listOfAddressesWithoutDupes = 
AddressId=1, NodeIds=List<int>{1,4,5}, 
AddressId=2, NodeIds=List<int>{2}}, 
AddressId=3, NodeIds=new List<int>{3} 

donc en gros je regarde une fonction groupby (ou autre chose) qui me obtenir au-dessus résultat

List<Address> listOfFilteredAddresses = listOfAddresses.GroupBy(x=>x.AddressId).Select(y=>new Address{AddressId=y.Key, NodeIds=?}); 

Merci à l'avance ..

Répondre

11

Vous y êtes presque:

List<Address> listOfFilteredAddresses = 
    listOfAddresses 
    .GroupBy(x=>x.AddressId) 
    .Select(y=>new Address{ 
     AddressId=y.Key 
    , NodeIds=y.SelectMany(x=>x. NodeIds).ToList() 
    }); 

Cela suppose que NodeIds dans le Address sont uniques; Si ce n'est pas le cas, ajouter Distinct() après SelectMany.

+0

Merci pour une réponse rapide. Ça a marché :) – santosh212

0

Il y a une meilleure façon:

List<Address> listOfFilteredAddresses = 
listOfAddresses 
.GroupBy(a => a.AddressId) 
.Select(g => new Address 
{ 
    AddressId = g.Key, 
    NodeIds = g.ToList() 
}); 
2

Vous pouvez le faire par une autre approche comme ci-dessous

var listOfFilteredAddresses = from e in listOfAddresses 
            group e by e.AddressId into g 
            select new 
           { 
            AddressID=g.Key, 
            NodeIDs=g.Select(x=>x.NodeIds).ToList() 
           }; 
Questions connexes