因此,您有一个输入对象序列,并且您希望将它们分组为具有相同 ID 的对象组。每个组都有一个Detail 对象列表,其中包含具有此 ID 的输入序列的 Val1 / Val2 / Val3
幸运的是,我不必创建函数,它已经存在。它被称为Enumerable.GroupBy
var groups = myInputList.GroupBy(
inputElement => inputElement.Id,
groupElement => new Detail()
{
val1 = groupElement.val1,
val2 = groupElement.val2,
val3 = groupElement.val3,
});
它的作用是从输入列表中获取所有元素。从这个输入列表中的每个元素中,它获取 Id。这是由第一个参数定义的:
inputElement => inputElement.Id,
属性 Id 具有相同值的所有 inputElement 都放在同一个组中。第二个参数说明您应该如何处理每个组中的元素:
groupElement => new Detail()
{
val1 = groupElement.val1,
val2 = groupElement.val2,
val3 = groupElement.val3,
}
这里说:如果你有一个元素应该放在这个组中,创建一个新的 Detail 对象,并按照描述给属性值
结果是一个实现 IGrouping 的对象序列。这意味着每个组都有一个属性 Key ,它具有您的值 ID,它是一个 Detail 对象序列,来自具有此 ID 的原始元素(请注意,我写的组是一个序列,而不是:有一个序列
如果你真的想要你描述的格式,你必须在它之后做一个选择:
.Select(group => new object () // why use this horrible name for your type?
{
Id = group.Key,
Details = group.ToList(),
})
.ToList();
通常,您会在查询后立即使用结果。在这种情况下,最好不要转换原始项目,只做 GroupBy
var groupsWithSameId = myInputList.GroupBy(inputElement => inputElement.Id);
foreach(var group in groupsWithSameId)
{
Console.WriteLine($"Group {group.Key}");
foreach (var element in group)
{
Console.WriteLine(element.Val1);
Console.WriteLine(element.Val2);
Console.WriteLine(element.Val2);
}
}
看到了吗?因为我没有对其他类进行所有预测,所以阅读/测试/维护要简单得多