Мне нужно выполнить поиск в коллекции объектов "Item", которые содержат свойство времени. У меня есть быстрое решение, но оно очень грязное (опубликую, если ничего лучше не появится). Ниже приведены мои попытки выполнить поиск самостоятельно, используя 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.
GetCollection
на самом деле лениво извлекает записи из базы данных или что-то в этом роде? Или выполнять дополнительную работу при повторении или вычислении егоtime
? - person Chris Sinclair   schedule 01.10.2012ICollection
, чтобы запустить на нем двоичный поиск? - person Sergey Kalinichenko   schedule 01.10.2012EventLogEntryCollection
поддерживает индексатор, несмотря на отсутствие реализацииIList
msdn.microsoft .com/en-us/library/ - person Jodrell   schedule 01.10.2012