Я пытаюсь сделать Linq GroupBy для некоторых объектов, используя явный тип ключа. Я не передаю IEqualityComparer
в GroupBy, поэтому согласно документам:
Сравнение сравнения по умолчанию
Default
используется для сравнения ключей.
Он объясняет свойство EqualityComparer<T>.Default
следующим образом:
Свойство
Default
проверяет, типT
реализуетSystem.IEquatable<T>
общий интерфейс и если это возвращаетEqualityComparer<T>
, который использует это реализация.
В приведенном ниже коде я группирую массив из объектов Fred
. Они имеют ключевой тип, называемый FredKey
, который реализует IEquatable<FredKey>
.
Этого должно быть достаточно, чтобы сгруппировать работу, но группировка не работает. В последней строке ниже у меня должно быть 2 группы, но у меня нет, у меня всего 3 группы, содержащие 3 элемента ввода.
Почему группа не работает?
class Fred
{
public string A;
public string B;
public FredKey Key
{
get { return new FredKey() { A = this.A }; }
}
}
class FredKey : IEquatable<FredKey>
{
public string A;
public bool Equals(FredKey other)
{
return A == other.A;
}
}
class Program
{
static void Main(string[] args)
{
var f = new Fred[]
{
new Fred {A = "hello", B = "frog"},
new Fred {A = "jim", B = "jog"},
new Fred {A = "hello", B = "bog"},
};
var groups = f.GroupBy(x => x.Key);
Debug.Assert(groups.Count() == 2); // <--- fails
}
}