8

以下のような単純なアドレスクラスがあるとします。

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

以下のようなアドレスのリストを入力しました。

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}}
}

そして、AddressIdsでグループ化して、結果リストに、以下のような重複の場合に基本的にロールアップされるNodeIdsが含まれるようにします。

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

だから基本的に私は上記の結果を得るgroupby関数(または何か他のもの)を見ています

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

前もって感謝します..

4

3 に答える 3

15

あなたはほとんどそこにいます:

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

NodeIdsこれは、Addressが一意であることを前提としています。そうでない場合は、のDistinct()後に追加しSelectManyます。

于 2012-06-27T00:31:50.017 に答える
2

あなたは以下のような別のアプローチで行うことができます

    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()
                                 };
于 2016-06-07T11:05:22.590 に答える
1

より良い方法があります:

List<Address> listOfFilteredAddresses =
listOfAddresses
.GroupBy(a => a.AddressId)
.Select(g => new Address
{
    AddressId = g.Key,
    NodeIds = g.ToList()
});
于 2016-03-23T18:15:16.470 に答える