我有一个List,UserObj有一个DateTime数据成员和一个字符串Name成员。 我想在列表中找到具有给定Name InputName的UserObj,并且DateTime最接近输入DateTime InputDT
可能会出现名称和日期时间,但会有一个独特的解决方案。
我想到了:
UserObj user = userObjList.Where(u => ((u.Name ==inputName) && (userObjList.Min())).ToList()[0];
但不确定如何指定最低条件?
答案 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)来做(一次通过列表找到最小值,然后第二次通过来获得该项目)。它可能需要对我的代码中的错误进行一些小的调整,但这个想法是合理的。 :)