C#合并父级别对象列表中的子对象列表

时间:2017-04-27 06:44:53

标签: c# linq linq-to-objects

如果您有一个List并且想要为具有相同Id字段的任何SomeObject合并子List,您将如何做到这一点?以下是示例对象:

public class SomeObject
{
    public string Name { get; set; }
    public int Id { get; set; }
    public List<KeyPair> ValuePairs {get;set;} 
}

public class KeyPair
{
    public string Key { get; set; }
    public string Value { get; set; }
}

这是模拟列表的示例创建:

List<SomeObject> objects = new List<SomeObject>();
        objects = new List<SomeObject>()
        {
            new SomeObject
            {
                Name="Rando Object 1",
                Id=5,
                ValuePairs=new List<KeyPair>()
                {
                    new KeyPair
                    {
                        Key="TestKey1",
                        Value="TestValue1"
                    },
                    new KeyPair
                    {
                        Key="TestKey2",
                        Value="TestValue2"
                    }
                }
            },
            new SomeObject
            {
                Name="Rando Object 2",
                Id=5,
                ValuePairs=new List<KeyPair>()
                {
                    new KeyPair
                    {
                        Key="TestKey3",
                        Value="TestValue3"
                    },
                    new KeyPair
                    {
                        Key="TestKey4",
                        Value="TestValue4"
                    }
                }
            }
        };

您需要做什么样的Linq或相关查询来创建基于具有匹配Id字段的任何顶级SomeObject合并的SomeObject的新列表;然后将他们的KeyPair列表组合到一个列表中。因此,您将使SomeObject Id = 5,然后从列表中的两个不同的先前SomeObject合并4个键对值。可以从新对象中省略名称值。

有什么想法吗?非常感谢你。

3 个答案:

答案 0 :(得分:5)

您需要按Id对其进行分组,然后使用SelectMany选择KeyPair列表。

var result = objects.GroupBy(o => o.Id).Select(group => new SomeObject
{
    Id = group.Key,
    ValuePairs = group.SelectMany(x => x.ValuePairs).ToList()
}).ToList();

答案 1 :(得分:2)

你可以试试这个:

var res = objects.GroupBy(o => o.Id)
                 .Select(group => new { 
                    Id = group.Key, 
                    ValuePairs = group.SelectMany(g => g.ValuePairs)
                  });

原帖:

var res = objects.Where(o => o.Id == 5).SelectMany(o => o.ValuePairs);

答案 2 :(得分:0)

使用此功能

https://dotnetfiddle.net/aE6p5H

public List<SomeObject> MergeObj(List<SomeObject> someObjects)
    {
        var idList = someObjects.Select(x => x.Id).Distinct().ToList();
        var newSomeObjects = new List<SomeObject>();
        idList.ForEach(x =>
        {
            var newValuePairList = new List<KeyPair>();
            someObjects.Where(y => y.Id == x).ToList().ForEach(y =>
            {
                newValuePairList.AddRange(y.ValuePairs);
            });
            newSomeObjects.Add(new SomeObject{Id = x, ValuePairs = newValuePairList});
        });

        return newSomeObjects;
    }