我想知道是否有可能使用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方法是否有效答案 0 :(得分:8)
是的,绝对的,单身人士可以正常工作:
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();
(这与最初声明的类型不太一致,因为你的示例代码也不能正常工作......但类似的东西会。)