比较器和单例



我想知道是否有可能在例如Distinct中使用单例作为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的对象可能会被创建很多次。在这种情况下,是否有使用singletone而不是在每次迭代中创建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();

(这与最初声明的类型不太匹配,因为您的示例代码也不太匹配…但是类似的东西会。)

相关内容

  • 没有找到相关文章

最新更新