我想知道是否有可能使用singleton作为comparerobject,例如distinct?是吗?
假设我有一个元素列表,我需要在该列表上使用不同的函数。通常我会这样做

var result  = list.Distinct(new ListElementComparer);

listermentcomparer是一个实现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() )  );

因此,正如您所知,listermentcomparer的对象可能会被创建很多次。在这种情况下,在每次迭代中使用singletone insted创建listermentcomparer有什么意义吗?如果我使用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();

(这对于最初声明的类型不太适用,因为您的示例代码也不太适用……但类似的事情会发生。)

关于c# - IEqualityComparer和单例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5640071/

10-13 05:58