Ich habe eine große Sammlung von Zeichenfolgen (bis zu 1M) alphabetisch sortiert. Ich habe mit LINQ-Abfragen gegen diese Sammlung mit HashSet, SortedDictionary und Dictionary experimentiert. Ich bin statische Caching der Sammlung, es ist bis zu 50 MB groß, und ich rufe immer die LINQ-Abfrage gegen die zwischengespeicherte Sammlung. Mein Problem ist, wie folgt:LINQ Leistung für große Sammlungen
Unabhängig von Kollektionstyp, Leistung ist viel schlechter als SQL (bis zu 200 ms). Wenn eine ähnliche Abfrage für die zugrunde liegenden SQL-Tabellen ausgeführt wird, ist die Leistung viel schneller (5-10 ms). Ich habe meine LINQ-Abfragen wie folgt umgesetzt:
public static string ReturnSomething(string query, int limit)
{
StringBuilder sb = new StringBuilder();
foreach (var stringitem in MyCollection.Where(
x => x.StartsWith(query) && x.Length > q.Length).Take(limit))
{
sb.Append(stringitem);
}
return sb.ToString();
}
Es ist mein Verständnis, dass die HashSet, Wörterbuch, usw. implementieren Lookups anstelle der Standard-Enumeration Binärbaum-Suche. Was sind meine Optionen für leistungsstarke LINQ-Abfragen in die erweiterten Sammlungsarten?
Ausgezeichnet! Hohe Leistung und genau das, was ich gesucht habe. Würden Sie diese Methode (natürlich modifiziert) empfehlen, um Eigenschaften in einer Sammlung von Nicht-String-Objekten abzufragen? –
Ja, Sie könnten die Index-Klasse generisch machen und ein HashSet anstelle einer Liste verwenden, dann könnten Sie Indizes für verschiedene Eigenschaften erstellen und die HashSets schneiden, um die zu durchsuchenden Elemente einzugrenzen. – Guffa
Was ist mit Strings kürzer als indexLength - Add() speichert sie nicht und Find() findet sie nicht? – Sam