#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();
(Это не совсем работает с первоначально объявленными типами, потому что ваш пример кода тоже не совсем работает… но что-то подобное было бы.)