我试图找出在24小时窗口内满足特定条件时搜索对象列表的最佳方法。我希望24小时的窗口足够灵活,以至于它不会在几天内完成,而只需要24小时。我的对象看起来像下面的东西。
public class Event {
public DateTime timestamp;
public string reason;
public long amount;
}
所以它会搜索这个列表,找出原因何时等于特定的东西,并且在24小时窗口内有10个这样的内容,它会返回这些10的列表以及任何额外的列表,而且还有更多。
答案 0 :(得分:1)
您可以向DateTime
个实例添加小时数,然后比较您的时间
var startOfWindow = DateTime.Now \\ or however you get your window start
var endOfWindow = startOfWindow.AddHours(24);
var interestingEvents = events
.Where(e => e.reason == "reason")
.Where(e=> startOfWindow <= e.timestamp && e.timestamp <= endOfWindow)
.ToList();
答案 1 :(得分:1)
要搜索所有24小时的时段(不仅仅是现在的24小时或任意范围),您可以这样做:
string reason = "???";
var query =
events.Where(ev => ev.Reason = reason)
.Select(ev => events.Where(ev2 => ev.Reason = reason &&
(ev.timestamp >= ev2.timestamp) &&
(ev.timestamp - ev2.timestamp).TotalHours <= 24))
.Where(g => g.Count() >= 10);
Transation:对于每个事件,在它之前的24小时内获取所有事件,并返回至少10个此类事件的所有组。
答案 2 :(得分:0)
使用LINQ
var search = events.Where(ev => ev.reason == "reason" && ev.timestamp >= DateTime.Now.AddHours(-24));
答案 3 :(得分:0)
也许这会解决问题
public IEnumerable<Event> EventsInTimeWindow(
IEnumerable<Event> events,
DateTime from,
DateTime to,
string reason,
int maxNoOfResults)
{
return events
.Where(evt =>
from <= evt.timestamp &&
evt.timestamp <= to &&
evt.reason == reason)
.Take(maxNoOfResults);
}
使用:
DateTime now = DateTime.Now;
var events = EventsInTimeWindow(someCollection, now.AddHours(-24), now, 15);
答案 4 :(得分:0)
有一个方法可以过滤然后返回结果,如:
public IEnumerable<Event> GetEvents(List<Event> list, string yourReason)
{
var query = list.Where(e => e.reason == "your reason" &&
e.timestamp >= DateTime.Now.AddHours(-24));
if (query.Count() >= 10)
return query;
else
return null;
}