1

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

Names 和 DateTimes 可能同时出现,但会有一个独特的解决方案。

我想过:

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

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

4

2 回答 2

8

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

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));
于 2012-05-16T13:54:06.450 回答
1

我认为以下内容应该可以工作,尽管它未经测试......

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);

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

它比给定的顺序要混乱得多,但它应该是 O(N) 来完成它(一次通过列表以找到最小值,然后第二次通过以获取该项目)。它可能需要对我的代码中的错误进行一些小的调整,但这个想法是合理的。:)

于 2012-05-16T14:03:49.337 回答