c# – IEqualityComparer和singleton

我想知道是否有可能使用singleton作为comparerObject,例如distinct?

假设我有一个元素列表,我需要在该列表中使用不同的函数.通常我会这样做

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是否有任何意义?如果我使用singleton,那么distinct方法会起作用吗?

解决方法

是的,绝对的,单身人士可以正常工作:
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();

(这不适用于最初声明的类型,因为您的示例代码也不能正常工作……但类似的东西会.)

相关文章

原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么