Ich möchte einige verschiedene Algorithmen für die Praxis umzusetzen, nur um zu sehen, wie schlecht ich wirklich bin und besser werden: pC#: Wie implementieren IOrderedEnumerable <T>
Auch immer, ich dachte, ich würde versuchen IEnumerable<T>
und IOrderedEnumerable<T>
zu verwenden und andere .Net-Sammlungstypen, nur um kompatibel zu sein (so dass das, was ich schreibe, später einfacher verwendet werden kann).
Aber ich kann keinen Weg finden, eine Instanz von IOrderedEnumerable<T>
anders als die Verwendung der Methoden OrderBy und ThenBy zurückzugeben. Ich denke also, ich muss meine eigene Klasse erstellen, die diese Schnittstelle implementiert. Aber die Schnittstelle macht für mich keinen Sinn, um ehrlich zu sein. Es könnte, aber ich bin mir nicht sicher.
habe ich eine leere Klasse, hinzugefügt, um die Schnittstelle und bekam dann ReSharper für mich leer Implementierungen hinzuzufügen. Es sieht wie folgt aus:
class MyOrderedEnumerable<T> : IOrderedEnumerable<T>
{
/// <summary>
/// Performs a subsequent ordering on the elements of an <see cref="T:System.Linq.IOrderedEnumerable`1"/> according to a key.
/// </summary>
/// <returns>
/// An <see cref="T:System.Linq.IOrderedEnumerable`1"/> whose elements are sorted according to a key.
/// </returns>
/// <param name="keySelector">The <see cref="T:System.Func`2"/> used to extract the key for each element.</param><param name="comparer">The <see cref="T:System.Collections.Generic.IComparer`1"/> used to compare keys for placement in the returned sequence.</param><param name="descending">true to sort the elements in descending order; false to sort the elements in ascending order.</param><typeparam name="TKey">The type of the key produced by <paramref name="keySelector"/>.</typeparam><filterpriority>2</filterpriority>
public IOrderedEnumerable<T> CreateOrderedEnumerable<TKey>(Func<T, TKey> keySelector, IComparer<TKey> comparer, bool descending)
{
throw new NotImplementedException();
}
/// <summary>
/// Returns an enumerator that iterates through the collection.
/// </summary>
/// <returns>
/// A <see cref="T:System.Collections.Generic.IEnumerator`1"/> that can be used to iterate through the collection.
/// </returns>
/// <filterpriority>1</filterpriority>
public IEnumerator<T> GetEnumerator()
{
throw new NotImplementedException();
}
/// <summary>
/// Returns an enumerator that iterates through a collection.
/// </summary>
/// <returns>
/// An <see cref="T:System.Collections.IEnumerator"/> object that can be used to iterate through the collection.
/// </returns>
/// <filterpriority>2</filterpriority>
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Was ich nicht verstehe, ist die CreateOrderedEnumerable
Methode. Was genau soll es machen? Nun, ich denke, es würde natürlich eine geordnete Aufzählung schaffen, aber wie? Soll der Sortieralgorithmus selbst dorthin gehen? Und was wird es sortieren? Es gibt keine Sammlung von Elementen, die zu dieser Methode gehören. Wo also soll die Sammlung abgerufen werden? Wie würdest du die Klasse benutzen? Soll es zum Beispiel als private Hilfsklasse in etwas implementiert werden, das Dinge sortieren muss?
Dann anstelle eines MyOrderedEnumerable<T> : IOrderedEnumerable<T>
, könnten Sie eine QuickSorter<T> : IOrderedEnumerable<T>
haben, die eine Sammlung in seinem Konstruktor nahm und es sortiert, wenn das CreateOrderedEnumerable
Methode aufgerufen wurde ... aber was würde dann passieren, wenn jemand GetEnumerator
genannt und begann vor diesem Verfahren aufzuzählen war aufgerufen worden?
Haha, nur entdeckte ich etwas ähnliches vor einer Weile here gefragt hatte. Aber das war nur, wenn es möglich war, eins zurückzugeben. Also ich denke, diese Frage eine Antwort auf die ich dort bekam eine Antwort ist =)
Sweet! Werde es sofort ausprobieren =) – Svish
Also würde es sich auf der Grundlage des neuen Vergleichs, den du ihm gegeben hast, neu anordnen? oder? nicht sicher, ob ich das verstanden habe ... – Svish
Es würde sich nicht neu ordnen - es würde eine neue Sequenz mit der neuen Reihenfolge erstellen, basierend auf der alten Reihenfolge und dem neuen Vergleich. Es würde nicht die alte Sequenz selbst verwenden, außer um die ursprünglichen ungeordneten Daten zu erhalten. Sehen Sie sich den Code für weitere Details an :) –