Pregunta Implementación anónima de IComparer


¿Es posible definir una implementación anónima de IComparer?

Creo que Java permite que las clases anónimas se definan en línea: ¿C #?

Al mirar este código, quiero definir una costumbre IComparer en línea

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer
)

35
2018-03-13 11:06


origen


Respuestas:


No, C # no permite actualmente implementaciones de interfaz en línea; a pesar de esto hace te permite crear delegados en línea a través de expresiones lambda y métodos anónimos.

En su caso, sugeriría usar un ProjectionComparer eso facilita el uso de esta función, como la que se incluye aquí.


9
2018-03-13 11:08



Como se indica en uno de los comentarios a continuación, .Net 4.5 lo permite a través de un método estático en la clase Comparer <>, p. comparar dos objetos basados ​​en el valor de una propiedad en la clase:

var comparer = Comparer<KilowattSnapshot>.Create( 
        (k1, k2) => k1.Kilowatt.CompareTo(k2.Kilowatt) );

Obviamente, esto puede usarse en línea en lugar de asignarse a una variable.


22
2018-02-16 02:57



Aunque no puede crear clases anónimas que implementen interfaces, generalmente puede usar Delegado de comparación en vez de Interfaz IComparer en la mayoría de los casos (como clasificación, etc.):

Array.Sort(arr, (x, y) => 1);

También hay algunas implementaciones integradas de IComparer como el Clase Comparer o el Clase StringComparer...


12
2018-03-13 11:32



.NET Framework versión 4.5 proporciona el método Comparer.Crea (Comparación) para crear comparadores basados ​​en un delegado de comparación específico (que puede ser una función lambda). Sin embargo, las personas que trabajan con versiones anteriores de .NET probablemente necesitarán implementar algo similar.


10
2018-03-20 10:08



No, esto no es posible Sin embargo, puede obtener la implementación predeterminada de IComparer<TKey> por Comparer<TKey>.Default. De lo contrario, deberá crear una implementación parametrizada y usar una instancia de eso.


3
2018-03-13 11:08



Eche un vistazo a estas 2 preguntas de SO, abordan esencialmente el mismo problema

Uso de Distinct con lista de objetos personalizados

Ajustar un delegado en un IEqualityComparer

Si sigue así, debe prestar especial atención a los comentarios de Slaks y La respuesta de Dan Tao sobre la implementación de hashcode


1
2018-03-13 11:34



C # no permite implementar interfaces utilizando clases internas anónimas en línea, a diferencia de Java. Para realizar comparaciones simples (es decir, comparar en una sola clave), hay una forma mejor de hacerlo en C #. Puedes simplemente usar el .OrderBy() método y pase una expresión lambda que especifica la clave.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;


namespace Test{
    public class Test{
        public static void Main(){
            IList<int> mylist = new List<int>();
            for(int i=0; i<10; i++) mylist.Add(i);
            var sorted = mylist.OrderBy( x => -x );
            foreach(int x in sorted)
                Console.WriteLine(x);
        }
    }
}

1
2018-03-13 11:28