以下是使用 C# LINQ 从泛型List<T>
中去重并获取每个重复项里最新的一条数据的示例,假设泛型列表中的元素类型有一个可以用于标识唯一性的属性(比如Id
)以及一个用于判断先后顺序的时间相关属性(比如DateTime
类型的UpdateTime
来表示更新时间,越新时间越大),以下以一个简单的自定义类为例来进行演示。
Model层
1. 定义示例类
class MyData
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime UpdateTime { get; set; }
}
2. 使用 LINQ 进行去重并取最新数据的操作
List<MyData> dataList = new List<MyData>()
{
new MyData { Id = 1, Name = "A", UpdateTime = new DateTime(2024, 12, 10) },
new MyData { Id = 2, Name = "B", UpdateTime = new DateTime(2024, 12, 11) },
new MyData { Id = 1, Name = "C", UpdateTime = new DateTime(2024, 12, 12) }
};
var distinctData = dataList.GroupBy(x => x.Id)
.Select(g => g.OrderByDescending(x => x.UpdateTime).First());
foreach (var item in distinctData)
{
Console.WriteLine($"Id: {item.Id}, Name: {item.Name}, UpdateTime: {item.UpdateTime}");
}
- 首先通过
GroupBy
方法按照Id
属性对列表中的元素进行分组,这样具有相同Id
的元素会被分到同一组中。 - 接着对于每个分组,使用
OrderByDescending
方法按照UpdateTime
属性进行降序排序,这样每个分组里最新的元素就排在最前面了。 - 最后通过
First
方法获取每个分组(也就是每个去重后的Id
对应的元素集合)里的第一条(也就是最新的那条)数据,最终得到的distinctData
就是去重且取到每个重复项里最新数据的集合了。
如果你的实际场景中用于判断唯一性和顺序的属性与上述示例不同,只需要相应地替换GroupBy
和OrderByDescending
中使用的属性表达式即可。