C# 合并父级对象列表中的子对象列表
C# Merge List of sub objects from parent level Object List
如果您有一个 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 或相关查询来创建新的 SomeObject 列表,该列表基于具有匹配 Id 字段的任何顶级 SomeObject 进行合并;然后将他们的 KeyPair 列表组合成一个列表。因此,您将拥有 SomeObject Id=5,然后从列表中的两个不同的先前 SomeObject 中合并 4 个键对值。名称值可以从新对象中省略。
有什么想法吗?非常感谢。
您需要按 Id
对它们进行分组,并使用 SelectMany
到 select KeyPair
列表。
var result = objects.GroupBy(o => o.Id).Select(group => new SomeObject
{
Id = group.Key,
ValuePairs = group.SelectMany(x => x.ValuePairs).ToList()
}).ToList();
你可以试试这个:
var res = objects.GroupBy(o => o.Id)
.Select(group => new {
Id = group.Key,
ValuePairs = group.SelectMany(g => g.ValuePairs)
});
原文post:
var res = objects.Where(o => o.Id == 5).SelectMany(o => o.ValuePairs);
使用这个功能
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;
}
如果您有一个 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 或相关查询来创建新的 SomeObject 列表,该列表基于具有匹配 Id 字段的任何顶级 SomeObject 进行合并;然后将他们的 KeyPair 列表组合成一个列表。因此,您将拥有 SomeObject Id=5,然后从列表中的两个不同的先前 SomeObject 中合并 4 个键对值。名称值可以从新对象中省略。
有什么想法吗?非常感谢。
您需要按 Id
对它们进行分组,并使用 SelectMany
到 select KeyPair
列表。
var result = objects.GroupBy(o => o.Id).Select(group => new SomeObject
{
Id = group.Key,
ValuePairs = group.SelectMany(x => x.ValuePairs).ToList()
}).ToList();
你可以试试这个:
var res = objects.GroupBy(o => o.Id)
.Select(group => new {
Id = group.Key,
ValuePairs = group.SelectMany(g => g.ValuePairs)
});
原文post:
var res = objects.Where(o => o.Id == 5).SelectMany(o => o.ValuePairs);
使用这个功能
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;
}