使用 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# 将两行合并为基于列的单行的主要内容,如果未能解决你的问题,请参考以下文章

SQL 将两行合二为一

Ms Access 像这样将两行合二为一

使用Python / Pandas将两行数据合并为一行

基于公共列将两张表合并为一张表

python pandas将两行或多行文本合并为一行

sqlserver怎么将两行数据合并成一行