3 Stimmen

LINQ-Abfrageoptimierung

Ich habe seit zwei Tagen meinen Kopf an die Wand geschlagen, aber ich kann die Laufzeit des folgenden LINQ nicht verbessern.

from obj in list
from obj1 in list1
where (obj1.ClassesName.Contains(obj.ClassName) && obj1.Count> 0)
select new { result = obj1.ClassName})

Ich muss nach obj.classname in der Liste obj1.classesname suchen. Sobald es in der Klassenname-Liste gefunden wurde, muss ich den Obj1-Klassennamen zurückgeben.

Ich habe 5 tausend Objekte in der Liste.

Die obige Abfrage dauert mehr als 30 Sekunden. Ich muss diese Zeit auf unter 5 Sekunden reduzieren.

Ich bin verwirrt und jede Hilfe wird zählen.

Vielen Dank im Voraus.

1voto

BrokenGlass Punkte 153950

Eine offensichtliche Verbesserung besteht darin, die Bedingung Count > 0 für list1 auszulagern, damit Sie diese Elemente überhaupt nicht berücksichtigen müssen:

from obj in list
from obj1 in list1.Where(x=> x.Count >0)
where (obj1.ClassesName.Contains(obj.ClassName))
select new { result = obj1.ClassName})

Da ClassesName eine List ist, können Sie auch eine Vorverarbeitung durchführen, um stattdessen eine Hashtable zu verwenden. Das macht die Suche O(1) anstelle von O(n), wobei n die Anzahl der Elemente in list1 ist.

0voto

j_mcnally Punkte 6844
(von obj1 in list1
where (obj1.Count > 0) && System.Linq.Enumerable.Any(from obj in list where obj1.ClassesName.Contains(obj.ClassName) select obj)
select new { result = obj1.ClassName});

Dies würde aufhören zu suchen, wenn es eine Übereinstimmung findet, das ist es, was Any macht, das würde die Anzahl der Datensätze reduzieren, die Sie durchsuchen, aber vielleicht verstehe ich nicht, was Sie erreichen möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X