LINQ查询查找具有最接近数据变量的对象以查询输入变量

时间:2012-05-16 13:46:59

标签: c# linq min

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

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

我想到了:

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

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

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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);

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

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