IEqualityComparer和singleton

问题描述

| 我想知道是否有可能在例如distinct ??中使用singleton作为comparerObject? 假设我有一个元素列表,并且需要在该列表上使用不同的函数。通常我会这样
var result  = list.distinct(new ListElementComparer);
ListElementComparer是一个实现IEqualityComparer接口的类。 但是,让我们假设我将以这种方式使用上面提到的代码
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() )  );
因此,您可能会多次创建ListElementComparer对象。在这种情况下,在每次迭代中是否都使用了创建ListElementComparer的单调指令?如果我使用单例,这种独特的方法会起作用吗?     

解决方法

是的,绝对可以,单例工作正常:
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
}
然后:
resultList.AddRange(element.Distinct(ListElementComparer.Instance);
请注意,可以略微避免整个循环:
var resultList = elementList
                     .SelectMany(x => x.Distinct(ListElementComparer.Instance))
                     .ToList();
(这不适用于最初声明的类型,因为您的示例代码也无法正常工作...但是类似的东西也可以。)     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...