Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 搜索24小时内发生的X数量_C#_.net - Fatal编程技术网

C# 搜索24小时内发生的X数量

C# 搜索24小时内发生的X数量,c#,.net,C#,.net,我试图找出在24小时窗口内满足特定条件时搜索对象列表的最佳方法。我更希望24小时的窗口足够灵活,它不是以天为单位,而是以24小时为单位。我的物体看起来像下面的东西 public class Event { public DateTime timestamp; public string reason; public long amount; } 因此,它会在这个列表中搜索原因是否与某个特定的原因相等,如果在24小时的窗口内有10个原因,它会返回这10个原因的列表,如果有

我试图找出在24小时窗口内满足特定条件时搜索对象列表的最佳方法。我更希望24小时的窗口足够灵活,它不是以天为单位,而是以24小时为单位。我的物体看起来像下面的东西

public class Event {
    public DateTime timestamp;
    public string reason;
    public long amount;
}
因此,它会在这个列表中搜索原因是否与某个特定的原因相等,如果在24小时的窗口内有10个原因,它会返回这10个原因的列表,如果有更多原因,还会返回其他原因的列表。

使用LINQ

var search = events.Where(ev => ev.reason == "reason" && ev.timestamp >= DateTime.Now.AddHours(-24));

也许这会奏效

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
实例添加小时数,然后比较您的时间

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();
var startOfWindow=DateTime.Now\\n或以任何方式启动窗口
var endOfWindow=startOfWindow.AddHours(24);
var interestingEvents=事件
.其中(e=>e.reason==“reason”)

。其中(e=>startOfWindow有一个方法进行筛选,然后返回如下结果:

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;
}
public IEnumerable GetEvents(列表,字符串)
{
var query=list.Where(e=>e.reason==“您的原因”&&
e、 时间戳>=DateTime.Now.AddHours(-24));
if(query.Count()>=10)
返回查询;
其他的
返回null;
}

要搜索所有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);
字符串原因=“?”;
变量查询=
事件。其中(ev=>ev.Reason=原因)
.选择(ev=>events.Where(ev2=>ev.Reason=Reason&&
(ev.timestamp>=ev2.timestamp)&&
(ev.timestamp-ev2.timestamp).TotalHours g.Count()>=10);

事务处理:对于每个事件,获取之前24小时内的所有事件,并返回至少有10个此类事件的所有组。

如果
时间戳是将来的呢?然后我将使用开始日期和结束日期,并将ev.时间戳与它们进行比较。我认为OP至少需要一定数量的匹配,而不是有限的匹配数字。就搜索所有24小时时段而言,这似乎是最接近的,但是我确实对这个示例有一些问题。ev2没有声明,因此我无法编译它。我注意到的另一件事是它没有检查事件原因以确保它也匹配,最后我认为它缺少a)某个地方。@7H3LaughingMan我已经做了这些更正-看看这是否对您不起作用。@D Stanley,我有一个示例程序,您可以在下面看到。在本例中,它实际上运行得很好,但是试图找出是否有办法防止同一事件多次出现。
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);