2014-12-11 2 views
1

Я пытаюсь понять разницу между двумя перегрузками Enumerable.Except метода т.е.Разница между двумя перегрузками Enumerable.Except?

  • За исключением (IEnumerable, IEnumerable)
  • За исключением (IEnumerable, IEnumerable, IEqualityComparer)

Очевидно, что первый differnce заключается в том, что первая перегрузка использует сопоставитель равенства по умолчанию, а другой использует IEqualityComparer, но я могу добиться того же результата с помощью первого метода, реализовав интерфейс IEquatable (как упоминалось выше n документация MSDN метода Except), то почему эта вторая перегрузка необходима?

+0

Ну, только для случаев, когда вы не можете реализовать интерфейс IEquatable по какой-либо причине (например, если это не ваш класс), но все же хотите использовать пользовательский сопоставитель. –

+0

Возможно, вы хотите использовать его на 2 'IEnuemrable ', но вы не можете изменить 'SomeThirdPartyClass', тогда вы должны использовать вторую перегрузку. –

+0

Иногда в зависимости от контекста существует несколько применимых правил равенства для объекта. IEquatable действительно обеспечивает один прецедент, поэтому в этих ситуациях вам нужно определить альтернативный компаратор и вторую перегрузку «Исключить». – code4life

ответ

11

Две причины:

  1. Вы можете только реализовать IEquatable<T> для собственных типов ... в то время как вы можете указать IEqualityComparer<T> для любого типа, можно ли изменить его самостоятельно или нет.

  2. Может быть несколько способов сравнения типа для равенства, но реализация IEquatable<T> позволяет только выразить один из них.

Простой пример все это было бы строки - считай:

string[] x = { "A", "B", "C" }; 
string[] y = { "A", "c" }; 

var bc = x.Except(y); 
var justB = x.Except(y, StringComparer.OrdinalIgnoreCase); 

Мы могли бы хотеть оба результата в разных условиях, что означает, что мы не могли справиться и с IEquatable<T> ... и мы не можем изменить то, как string реализует IEquatable<T> в любом случае. (Вы, конечно, не ограничиваетесь StringComparer - вы можете написать сопоставитель равенства, который просто использовал длину строки, например.)

Это не относится к LINQ, либо - это, как правило, для любого API, который имеет дело с равенством, например HashSet<>, Dictionary<,> и т. Д.

+0

Спасибо, Джон! Очень хорошо объяснил :) – Coder23

 Смежные вопросы

  • Нет связанных вопросов^_^