【问题标题】:LINQ query finding object with closest data variable to query input variableLINQ 查询查找对象与查询输入变量最接近的数据变量
【发布时间】:2012-05-24 02:21:16
【问题描述】:

我有一个 List,其中 UserObj 有一个 DateTime 数据成员和一个字符串 Name 成员。 我想在具有给定名称 InputName 和 DateTime 最接近输入 DateTime InputDT 的列表中找到 UserObj

名称和日期时间可能同时出现,但会有一个独特的解决方案。

我想过:

UserObj user = userObjList.Where(u => ((u.Name ==inputName) && (userObjList.Min())).ToList()[0];

但不确定如何指定最小条件?

【问题讨论】:

标签: c# linq min


【解决方案1】:

按两个日期的绝对差对它们进行排序,然后取第一个。

UserObj user = userObjList
    .Where(u => u.Name == inputName)
    .OrderBy(u => Math.Abs((u.Date - inputDT).TotalSeconds))
    .First();

或使用MinBy 扩展:

UserObj user = userObjList
    .Where(u => u.Name == inputName)
    .MinBy(u => Math.Abs((u.Date - inputDT).TotalSeconds));

【讨论】:

  • 我想到了这个,但它不是最优的,因为它订购而不是简单地选择最小值。
  • @gwizardry:你的数据集有多大?
  • 可能不是很大~100,但操作可能会经常重复,一般来说优化很重要。
  • @gwizardry 然后你可以尝试扩展like this 来查找具有最小值的元素。如果速度很重要,请务必进行比较测试;你可能会发现里面没有很多。
【解决方案2】:

我认为以下内容虽然未经测试应该可以工作...

var validUserObjs = userObjList.Where(u => u.Name ==inputName);
double mintime = validUserObjs.Min(u=>Math.Abs((u.Date-inputDate).TotalSeconds));
var result = validUserObjs.First(u=>Math.Abs((u.Date-inputDate).TotalSeconds)==mintime);

这个想法是它首先由用户获取有效的用户对象。然后它会找到最接近的日期与输入日期的距离。然后它通过使用该时间差找到特定的项目。

它比使用 order by 的要复杂得多,但它应该是 O(N) 来完成(一次遍历列表以找到最小值,然后第二次遍历以获取该项目)。它可能需要对我的代码中的错误进行一些小的调整,但这个想法是合理的。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 2011-08-29
    相关资源
    最近更新 更多