IEqualityComparer и singleton

#c# #linq #icomparer

#c# #linq #icomparer

Вопрос:

Мне было интересно, есть ли возможность использовать singleton в качестве comparerObject, например, в Distinct??

Допустим, у меня есть список элементов, и мне нужно использовать distinct function в этом списке. Обычно я бы сделал это таким образом

 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 на каждой итерации? Будет ли работать метод distinct, если я использую singleton??

Ответ №1:

Да, безусловно, это будет отлично работать с singleton:

 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();
  

(Это не совсем работает с первоначально объявленными типами, потому что ваш пример кода тоже не совсем работает… но что-то подобное было бы.)