c# – IEqualityComparer和singleton

前端之家收集整理的这篇文章主要介绍了c# – IEqualityComparer和singleton前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想知道是否有可能使用singleton作为comparerObject,例如Distinct?

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

  1. var result = list.Distinct(new ListElementComparer);

ListElementComparer是一个实现IEqualityComparer接口的类.
但是,让我们假设我将经常使用上面提到的代码,例如这种方式.

  1. List<List<Element>> elementList = new List<List<Elements>>();
  2. List<List<Element>> resultList new List<List<Element>>();
  3.  
  4. foreach(var element in elementList )
  5. resultList.AddRange(element.Distinct(new ListElementComparer() ) );

因此,您可以创建很多次ListElementComparer的对象.在这种情况下,在每次迭代中使用单线程创建ListElementComparer是否有任何意义?如果我使用singleton,那么distinct方法会起作用吗?

解决方法

是的,绝对的,单身人士可以正常工作:
  1. public class ListElementComparer : IEqualityComparer<List<Element>>
  2. {
  3. public static ListElementComparer Instance { get { return instance; } }
  4.  
  5. private static readonly ListElementComparer instance =
  6. new ListElementComparer();
  7.  
  8. private ListElementComparer() {}
  9.  
  10. // Implement IEqualityComparer<List<Element>> here
  11. }

然后:

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

请注意,您可以在某种程度上避免整个循环:

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

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

猜你在找的C#相关文章