如何使用LINQ实现按类别去重并合并同类别唯一值?
使用LINQ实现分组去重并合并值的需求
这其实是个很典型的分组+去重+字符串拼接需求,用LINQ可以很优雅地实现,我给你一步步拆解:
首先,我们先假设你的数据是一个实体类集合,先定义一个简单的类来承载数据:
public class CategoryItem { public int CategoryId { get; set; } public string Value { get; set; } }
接下来初始化你的原始测试数据:
var rawData = new List<CategoryItem> { new CategoryItem { CategoryId = 1, Value = "val1" }, new CategoryItem { CategoryId = 1, Value = "val2" }, new CategoryItem { CategoryId = 1, Value = "val2" }, new CategoryItem { CategoryId = 2, Value = "test1" }, new CategoryItem { CategoryId = 2, Value = "test1" }, new CategoryItem { CategoryId = 3, Value = "data1" }, new CategoryItem { CategoryId = 3, Value = "data2" }, new CategoryItem { CategoryId = 3, Value = "data2" } };
核心LINQ查询语句
下面就是实现需求的关键代码,我会逐段解释作用:
var groupedResult = rawData // 第一步:按CategoryId分组,把相同ID的项归为一组 .GroupBy(item => item.CategoryId) // 第二步:对每个分组进行处理,生成目标格式的结果 .Select(group => new { CategoryId = group.Key, // 分组的键就是对应的CategoryId // 提取分组内的所有Value,去重后用". "拼接,最后加上结尾的句号匹配格式 Value = string.Join(". ", group.Select(item => item.Value).Distinct()) + "." });
验证结果
如果你想输出结果看看是否符合预期,可以用foreach遍历打印:
// 先打印表头 Console.WriteLine($"{nameof(CategoryItem.CategoryId),-12} {nameof(CategoryItem.Value)}"); foreach (var resultItem in groupedResult) { Console.WriteLine($"{resultItem.CategoryId,-12} {resultItem.Value}"); }
输出结果会和你期望的完全一致:
CategoryId Value 1 val1. val2. 2 test1. 3 data1. data2.
关键步骤说明
- GroupBy:将原始数据按照
CategoryId进行分组,确保每个CategoryId对应一个独立的组集合。 - Distinct:对每个分组内的
Value去重,保证每个值只保留一次,避免重复内容。 - string.Join:把去重后的多个
Value用.连接成一个连贯的字符串,最后额外加一个句号,完全匹配你需要的输出格式。
如果你的数据是从数据库中查询的(比如用EF Core),这段代码同样适用——Distinct和GroupBy会被转换为对应的SQL语句在数据库端执行,最终内存中的处理逻辑和上述完全一致。
内容的提问来源于stack exchange,提问作者alomegah
相关产品推荐
相关产品推荐

