使用 LINQ C# 将两行合并为基于列的单行
Posted
技术标签:
【中文标题】使用 LINQ C# 将两行合并为基于列的单行【英文标题】:Merge two rows into single row based on a column using LINQ C# 【发布时间】:2021-07-18 23:26:16 【问题描述】:我有一个如下所示的对象列表。我想根据 B 列将每两行连接成单行。可以肯定,每个单列 B 值只有两行。
输入
输出
但是,我已经做到了,并且解决方案有效。但我正在寻找更好的解决方案。我对我的解决方案不太满意。
我的解决方案:
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 对象按预期返回两行。
【问题讨论】:
你想按b列分组吗? @auburg 是的。想要按列 B 分组。 那么到目前为止你得到了什么代码?你卡在什么地方了? @auburg 在下面的问题中添加了我的解决方案。但是我的解决方案有效,但我对它不满意并寻找更好的解决方案。我认为它可以。 SO 并不是建议改进工作代码的地方。也许在codereview.stackexchange.com 发帖。我认为你所做的没有什么问题 【参考方案1】:您可以使用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();
【讨论】:
以上是关于使用 LINQ C# 将两行合并为基于列的单行的主要内容,如果未能解决你的问题,请参考以下文章