C# 使用LINQ C基于列将两行合并为一行#
我有一个如下的对象列表。我想根据B列将每两行合并为一行。可以肯定的是,对于每一列B值,只有两行 输入 输出 然而,我已经做到了,解决方案是有效的。但我正在寻找更好的解决方案。我对我的解决方案不太满意 我的解决方案:C# 使用LINQ C基于列将两行合并为一行#,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,我有一个如下的对象列表。我想根据B列将每两行合并为一行。可以肯定的是,对于每一列B值,只有两行 输入 输出 然而,我已经做到了,解决方案是有效的。但我正在寻找更好的解决方案。我对我的解决方案不太满意 我的解决方案: var groupByItems = items.GroupBy(x => x.ColumnB).Select(x => new MappingClass { ColumnA= x.FirstOrDefault().Column
var groupByItems = items.GroupBy(x => x.ColumnB).Select(x => new MappingClass
{
ColumnA= x.FirstOrDefault().ColumnA,
ColumnB= x.FirstOrDefault().ColumnB,
ColumnC= x.Where(r=> !string.IsNullOrEmpty(r.ColumnC)).Select(r=>r.ColumnC).FirstOrDefault(),
ColumnD= x.Where(r => !string.IsNullOrEmpty(r.ColumnD)).Select(r => r.ColumnD).FirstOrDefault(),
}).ToList();
现在groupByItems对象按预期返回两行。您可以使用由
GroupBy()生成的组的键。
此外,无需使用。Where()
您只需将过滤器作为lambda表达式放入。FirstOrDefault()
中即可用于ColumnC和ColumnD
var groupByItems = items.GroupBy(x => new { ColumnA = x.ColumnA, ColumnB = x.ColumnB })
.Select(x => new MappingClass
{
ColumnA = x.Key.ColumnA,
ColumnB = x.Key.ColumnB,
ColumnC = x.FirstOrDefault(m => !string.IsNullOrEmpty(m.ColumnC)).ColumnC,
ColumnD = x.FirstOrDefault(m => !string.IsNullOrEmpty(m.ColumnD)).ColumnD
})
.ToList();
你想按b列分组吗?@auburg是的。想按列B分组。到目前为止,您得到了什么代码?“你被困在哪一点上?”奥伯格在下面的问题中补充了我的答案。然而,我的解决方案是可行的,但我不满意它,并在寻找更好的解决方案。我认为它可以。因此,它不是建议改进工作代码的地方。也许寄到。我看你做的事没什么错