C# 搜索24小时内发生的X数量
我试图找出在24小时窗口内满足特定条件时搜索对象列表的最佳方法。我更希望24小时的窗口足够灵活,它不是以天为单位,而是以24小时为单位。我的物体看起来像下面的东西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个原因的列表,如果有
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);