c# - 查找重复的项目,然后选择日期与 currentDate 最接近的一项

标签 c# linq ienumerable

注意:使用 Windows Mobile 6.5 Compact Framework。

我有以下对象的集合。

public class RFileModel
{
    public List<string> RequiredFilesForR = new List<string>();
    public string Date { get; set; }
    public string RouteId { get; set; }
}

var ListOfRFileModels = new List<RFileModel>();

相同的 RouteId 可能会出现在 RFileModel 的多个实例中,但具有不同的Date

我正在尝试识别重复项并仅选择一个,即最接近当前日期的一个。

到目前为止我有以下 LINQ:

var query =  ListOfRFileModels.GroupBy(route => route.RouteId)
                              .OrderBy(newGroup => newGroup.Key)
                              .Select(newGroup => newGroup).ToList();

但我认为这不是我需要的,因为它仍然返回所有元素。我期待一个非唯一的 RouteId 列表,这样我就可以迭代每个非唯一的 id 并比较日期以查看要保留哪个。

如何使用 LINQ 或普通的 ole foreach 来完成此操作?

最佳答案

您的表达式对组进行排序,而不是对组元素进行排序。以下是修复方法:

DateTime currentDate = ...
var query =  ListOfRFileModels
    .GroupBy(route => route.RouteId)
    .Select(g => g.OrderBy(fm => currentDate-fm.Date).First())
    .ToList();

currentDate-fm.Date 表达式生成当前日期与 RFileModel 对象的日期之间的差异。差异最小的对象最终将位于有序序列的第一个位置。调用 First() 从组中选取它以产生最终结果。

关于c# - 查找重复的项目,然后选择日期与 currentDate 最接近的一项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33245517/

相关文章:

c# - 字典初始化在 C# 中如何工作?

C# 你打算调用方法吗

F# 和接口(interface)协方差 : what to do?(特别是 seq<> aka IEnumerable<>)

c# - 为什么我必须创建 `IEnumerable<T>` 的具体实现才能修改其成员?

c# - Microsoft.VisualStudio.TestTools.UnitTesting.Assert 泛型方法重载行为

c# - 使用自定义属性跳过body方法

c# - Entity Framework 运行存储过程和 native 查询性能注意事项

linq - 基于使用 LINQ 的函数将 IEnumerable<T> 分区/拆分/部分到 IEnumerable<IEnumerable<T>>?

c# - LINQ 嵌套数组和三元运算符。不支持嵌套查询。操作 1 ='Case' 操作 2 ='Collect'

arrays - 将IEnumerable <T>转换为T []的最佳方法