GroupBy分组后如何筛选非空记录
使用linq的groupby方法按主键分组,并在每组内通过orderby将非空值排在前面,随后取第一条记录即可实现去重并优先保留非空数据。具体做法是先对组内元素排序,排序规则是判断关键字段是否为空,非空的排在前,空的排在后,最后调用first()获取该组的代表项。

处理多字段组合重复时的逻辑
当重复判定涉及多个字段时,可以将这些字段组合成一个匿名对象作为GroupBy的键,然后在组内依然应用“非空优先”的排序策略。这样能确保在复杂业务场景下,只要某条记录的指定字段有值,就能被优先选中,从而保持数据的完整性。

基于输入数据中所有记录均为空值的边界情况
如果分组后的所有记录对应字段均为空值,上述排序逻辑依然有效,因为所有元素的排序权重相同,First()会返回组内的第一条原始记录。这保证了即使没有非空数据可保留,程序也不会抛出异常或丢失数据,而是稳定地返回一条默认记录。
以下是完整的C#控制台程序示例,演示了如何使用LINQ处理包含空值的重复记录:
using System;
using System.Collections.Generic;
using System.Linq;
public class Record
{
public string Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main()
{
var records = new List<Record>
{
new Record { Id = "1", Name = null },
new Record { Id = "1", Name = "Alice" },
new Record { Id = "2", Name = null },
new Record { Id = "2", Name = null },
new Record { Id = "3", Name = "Bob" },
new Record { Id = "3", Name = null }
};
var result = records
.GroupBy(r => r.Id)
.Select(g => g.OrderBy(x => x.Name == null).First())
.ToList();
foreach (var r in result)
{
Console.WriteLine($"Id: {r.Id}, Name: {r.Name ?? "(null)"}");
}
}
}
预期输出结果如下:
Id: 1, Name: Alice Id: 2, Name: (null) Id: 3, Name: Bob


















