在24小时内搜索X次出现次数

时间:2015-02-11 18:03:23

标签: c# .net

我试图找出在24小时窗口内满足特定条件时搜索对象列表的最佳方法。我希望24小时的窗口足够灵活,以至于它不会在几天内完成,而只需要24小时。我的对象看起来像下面的东西。

public class Event {
    public DateTime timestamp;
    public string reason;
    public long amount;
}

所以它会搜索这个列表,找出原因何时等于特定的东西,并且在24小时窗口内有10个这样的内容,它会返回这些10的列表以及任何额外的列表,而且还有更多。

5 个答案:

答案 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;
}