Frage

In einem Projekt an dem ich arbeite, gibt es wirklich große Sammlungen (1 M-1B-Elemente), und die Dinge werden als Sammlungen meist geändert.

Es ist eine Echtzeit-Anwendung, und so die Leistung im Vordergrund steht.

Für einige der Operationen, wie umge, Binary (möglich?), Werden usw. leiden mehr als andere, wie Wählen, etc.

Ist es möglich zu implementieren, die eigene IEnumerable mit möglichen Movenext, MovePrev, etc. und own LINQ-Erweiterungen implementiert, die Vorteile dieser nehmen?

Wenn dies gonna passieren, es würde am Ende des Projektes geschehen. Weil wir erhalten müssen zunächst daran zu arbeiten, dann macht es schneller.

Alles in allem sollte dies nicht zu viel Arbeit, nicht wahr?

War es hilfreich?

Lösung

Es ist sehr durchaus möglich, eine eigene Implementierung von Enumerable zu schaffen, die einige Situationen Spezialfall könnte. Sie würden im Grunde wollen Sie Ihre eigene Sammlungstypen erkennen (oder möglicherweise nur Sammlungen wie List<T>) und verwenden, um eine effizientere Implementierung, wo anwendbar.

Ich habe ein Beispielprojekt , die ich verwenden „Demo LINQ to Objects in einer Stunde Umsetzung ", die Du auf Beispiele suchen. Es ist nicht eine vollständige Umsetzung und insbesondere ist es weniger effizienter als die reale LINQ to Objects -. Sie können jedoch nach wie vor interessant finden

Alternativ können Sie diese i4o finden (Indexed LINQ) alles macht man aus der Box benötigen - oder dass Sie wäre besser dran, dass bei als von Grund auf neu. Wert.

Denken Sie daran, dass am Ende des Tages, LINQ ist im Grunde ein schönes Design mit syntaktischem Zucker gekoppelt. Die C # Compiler nicht wissen, alles Besonderes System.Linq.Enumerable, zum Beispiel.

Andere Tipps

Wenn Sie wirklich Leistung möchten, können Sie ziemlich viel tun. Beachten Sie, dass die folgende Auswahl:

var result = from element in collection
             where element.Id == id
             select element;

Kompiliert wie:

var result = collection.Where(element => element.Id == id);

Wenn Sie die folgende Methode für die Art der collection erstellen, dann können Sie die Tatsache ausnutzen, dass die primäre Aktion Gleichheit des Id-Mitgliedes und die Anforderung in optimierter Weise handhaben. Das Wichtigste ist richtig, die leistungskritische Operationen auf Ihrer Sammlung zu identifizieren und die richtigen Algorithmen (das heißt Komplexität) die Wahl, sie auszuführen.

public IEnumerable<TElement> Where(Expression<Func<TElement, bool>> selector)
{
    // detect equality of the Id member and return some special value
}

Betrachten System.Linq.Enumerable.Reverse (.) - diese Methode vollständig die IEnumerable aufzählt, bevor das erste Ergebnis der Rückkehr

Wenn Ihre Abfrage ist myCollection.Reverse (). Nehmen Sie (10), und die Sammlung hat Milliarden von Elementen, es ist eine schreckliche Idee ist es, die Milliarden von Artikeln aufzuzählen 10 zu bekommen.

Wenn Sie einen Reverse-Methode auf Ihre eigene Art geliefert wird, können Sie eine bessere Umsetzung liefern, die einfach Schleifen rückwärts über die Sammlung (von Index möglicherweise).

Der Schlüssel dazu ist Ihre eigene Art liefern, wo Sie die Implementierungen steuern. Sie können nicht die Implementierungen verwenden, die für alle IEnumerable<T> arbeiten, weil diese Implementierungen nicht den vollen Nutzen aus den Möglichkeiten Ihrer benutzerdefinierten Sammlung Art stattfinden wird.

  

Ist es möglich zu implementieren, die eigene   IEnumerable mit möglichen Movenext,   MovePrev, etc. und implementiert LINQ besitzen   Erweiterungen, die nehmen Vorteile   diese?

IEnumerable (oder richtiger, IEnumerator) nicht MovePrev. Sie könnten eine Schnittstelle definieren:

public interface IReversable<T> : IEnumerable<T>
{
    IEnumerator<T> GetReverseEnumerator();
}

Diese von jedem Container umgesetzt werden könnten, die eine effiziente Reverse-Enumeration unterstützt.

Sie könnten dann eine Überlastung von Reverse (die Extension-Methode) schreiben, um diese neue Schnittstelle abarbeiten, und Collection-Klassen, die die Schnittstelle implementieren, etc. Und dann würden Sie diese Sammlung Klassen statt Standard diejenigen wie List<T> verwenden müssen .

Aber (ich habe Reflektor nicht praktisch zu überprüfen) kann es sein, dass die eingebauten Reverse ist intelligent genug, um Dinge, die die schnelle Art und Weise zu tun, wenn es die IList Schnittstelle aus der Sammlung zu bekommen, das die am häufigsten optimieren würde Fällen ohnehin nur in Ordnung.

So gibt nicht viel Punkt in dieser Art von Ansatz sein kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top