2015-02-11 45 views
2

我試圖找出在24小時窗口內滿足特定條件時搜索對象列表的最佳方式。我更希望24小時的窗口足夠靈活,以至於不會有天而是24小時。我的對象看起來像下面的東西。在24小時內搜索X次出現的次數

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

所以它會通過這個列表中搜索時的理由等於具體的事情和一個24小時的時限內就出現了這些10櫃面有將一起返回那些10的列表,任何額外的人更多。

回答

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); 

轉換:對於每個事件,在它之前的24小時內獲取所有事件,並返回至少有10個此類事件的所有組。

+0

這似乎是搜索所有24小時時段最接近的問題,但我確實遇到了一些與此示例有關的問題。 ev2沒有被聲明,所以我不能編譯它。我注意到的另一件事是它不檢查事件原因以確保它匹配,最後我認爲它在某處丟失了。 – 7H3LaughingMan 2015-02-11 21:43:40

+0

@ 7H3LaughingMan我已經做出了這些更正 - 看看是否不適合你。 – 2015-02-11 21:51:13

+0

@D Stanley,我有一個示例程序,您可以在http://pastebin.com/dEqEtR0P上看到。在這個例子中它實際上運行得非常好,但試圖找出是否有辦法防止同一個事件多次出現。 – 7H3LaughingMan 2015-02-12 17:46:38

0

使用LINQ

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

如果'timestamp'在將來怎麼辦? – juharr 2015-02-11 18:10:33

+0

然後我會使用開始日期和結束日期,並將ev.timestamp與它們進行比較 – 2015-02-11 18:12:30

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); 
+1

我認爲OP至少需要一定數量的匹配,而不是有限的數目。 – juharr 2015-02-11 18:13:38

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(); 
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; 
} 
相關問題