[c#] C #: cómo implementar IOrderedEnumerable <T>


Answers

Presumiblemente, su clase tendrá alguna variable de almacenamiento interno que implemente IEnumerable ( List<T> por ejemplo). La implementación de este método es simple en tal caso:

private List<T> data = new List<T>();

public IOrderedEnumerable<CalculationResult> CreateOrderedEnumerable<TKey>(Func<CalculationResult, TKey> keySelector, IComparer<TKey> comparer, bool descending)
{
  return descending ? 
      data.OrderByDescending(keySelector, comparer) 
    : data.OrderBy(keySelector, comparer);
}
Question

Quiero implementar algunos algoritmos diferentes para la práctica, solo para ver qué tan mal realmente soy y para mejorar: p

De todos modos, pensé que trataría de usar IEnumerable<T> y IOrderedEnumerable<T> y otros tipos de colecciones .Net solo para ser compatible (para que lo que escribo pueda usarse más fácilmente más adelante).

Pero no puedo encontrar una forma de devolver una instancia de IOrderedEnumerable<T> no sean los métodos de extensión OrderBy y ThenBy. Así que supongo que tengo que crear mi propia clase que implemente esta interfaz. Pero la interfaz no tiene sentido para mí para ser honesto. Podría, pero no estoy seguro.

Creé una clase vacía, agregué la interfaz y luego obtuve ReSharper para agregar implementaciones vacías para mí. Se parece a esto:

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();
    }
}

Lo que no entiendo es el método CreateOrderedEnumerable . ¿Qué es exactamente lo que debe hacer? Bueno, supongo que, por supuesto, crearía un enumerable ordenado, pero ¿cómo? ¿Se supone que el algoritmo de clasificación debe ir allí? ¿Y qué ordenará? No hay una colección de artículos que vayan a ese método, entonces, ¿dónde está destinado a ordenar la colección? ¿Cómo usarías la clase? ¿Está destinado a ser implementado como, por ejemplo, una clase de ayuda privada dentro de algo que necesita ordenar cosas?

Luego, en lugar de un MyOrderedEnumerable<T> : IOrderedEnumerable<T> , podría tener un QuickSorter<T> : IOrderedEnumerable<T> que tomó una colección en su constructor y la ordenó cuando se llamó a ese método CreateOrderedEnumerable ... pero ¿qué haría entonces? sucede si alguien llamó a GetEnumerator y comenzó a enumerar antes de que se llamara ese método?

Jaja, acaba de descubrir que había preguntado algo similar hace un tiempo aquí . Pero eso era solo si era posible devolver uno. Así que supongo que esta pregunta es una respuesta a la única respuesta que obtuve allí =)






Related