我需要搜索包含时间属性的“项目”对象集合。我有一个快速的解决方案,但它非常混乱(如果没有更好的方法会发布)。以下是我自己使用 LINQ 等执行搜索的尝试。
在我的特殊情况下,我知道这些物品是根据时间从低到高排列的。当我遍历它们时,它是 9/12、9/13、9/14。我想找到一个快速的解决方案,即使没有订购,但现在并不重要。
//ICollection c = GetCollection(); //25,000+ items
DateTime TIME = DateTime.Now.AddDays(-1);
EventLog scan = new EventLog("Application", "Server", "N/A");
EventLogCollection c = scan.Entries;
Console.WriteLine(logs.Count); // All entries already in list here
// 64 sec - SLOW
List<Item> l1 = new List<Item>();
foreach (Item i in c) {
if (i.time > TIME) {
l1.Add(i); }
}
// 93 sec - SLOWER
var l2 = c.Cast<Item>().AsParallel().Select(n => n.time > TIME);
var i = l2.Count();
// 98 sec - EVEN SLOWER!
List<Item> l3 = new List<Item>();
Parallel.ForEach(c.Cast<Item>(), n => {
if (n.time > TIME) {
l3.add(n);
}
});
我当前的解决方案是对开始时间和结束时间进行 BinarySearch,并根据这些索引循环遍历 ICollection。它非常快(1-2 秒)但非常混乱。我不需要不同的解决方案,但我想我会把它扔给你的性能专家。
是否有更快、更优雅的方式来搜索 ICollection?顺便说一句,我无法控制我收到的集合,也无法更改它的结构。.NET 4.0
不,我不能使用 System.Diagnostics.Eventing.Reader 因为我坚持使用 Windows XP