【问题标题】:C# Merge List of sub objects from parent level Object ListC#合并来自父级对象列表的子对象列表
【发布时间】:2017-09-24 19:32:35
【问题描述】:

如果您有一个列表并且想要合并任何具有相同 Id 字段的 SomeObject 的子列表,您会怎么做?以下是示例对象:

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 或相关查询来创建新的 SomeObject 列表,该列表基于具有匹配 Id 字段的任何顶级 SomeObject 进行合并;然后将他们的 KeyPair 列表组合成一个列表。因此,您将拥有 SomeObject Id=5,然后从列表中的两个不同的先前 SomeObject 合并 4 个密钥对值。名称值可以从新对象中省略。

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

【问题讨论】:

    标签: c# linq linq-to-objects


    【解决方案1】:

    您需要将它们按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();
    

    【讨论】:

    • 这太棒了!
    【解决方案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);
    

    【讨论】:

    • 这将返回KeyPair的列表,但他需要有SomeObject的列表和IdKeyPair的分组列表
    • 正确,我将编辑答案并遵守 OP 要求,从新对象中省略 Name
    【解决方案3】:

    使用此功能

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

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多