2011-04-12 10 views
5

Me preguntaba si existe la posibilidad de utilizar singleton como comparerObject en, por ejemplo, Distinct ??IEqualityComparer y singleton

Digamos que tengo una lista de elementos y necesito usar funciones distintas en esa lista. Normalmente lo haría de esta manera

var result = list.Distinct(new ListElementComparer); 

ListElementComparer es una clase que implemente la interfaz IEqualityComparer. Sin embargo, supongamos que usaré el código mencionado anteriormente con bastante frecuencia, por ejemplo, de esa manera.

List<List<Element>> elementList = new List<List<Elements>>(); 
List<List<Element>> resultList new List<List<Element>>(); 

foreach(var element in elementList) 
    resultList.AddRange(element.Distinct(new ListElementComparer()) ); 

Así que como puede objetar de ListElementComparer podría crearse muchas veces. En este caso, ¿hay algún punto de usar singletone en lugar de crear ListElementComparer en cada iteración? ¿Funcionará el método distinto si uso singleton?

Respuesta

7

Sí, por supuesto, no tendrán ningún problema con un producto único:

public class ListElementComparer : IEqualityComparer<List<Element>> 
{ 
    public static ListElementComparer Instance { get { return instance; } } 

    private static readonly ListElementComparer instance = 
     new ListElementComparer(); 

    private ListElementComparer() {} 

    // Implement IEqualityComparer<List<Element>> here 
} 

continuación:

resultList.AddRange(element.Distinct(ListElementComparer.Instance); 

Tenga en cuenta que toda su bucle se puede evitar un poco:

var resultList = elementList 
        .SelectMany(x => x.Distinct(ListElementComparer.Instance)) 
        .ToList(); 

(Esto no funciona del todo con los tipos declarados originalmente, porque el código de muestra tampoco funciona bien ... pero algo s imilar lo haría.)