Я пытаюсь реализовать IEqualityComparer для моего объекта, который в основном определяет, является ли объект старше другого. Следующий простой пример синтезирует то, что я пытаюсь выполнить:Странное поведение в IEqualityComparer
class Program
{
static void Main(string[] args)
{
var authorsList = new List<Author>()
{
new Author{ Firstname = "Bob", Lastname = "Smith", Age=11 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=20 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=14 },
new Author{ Firstname = "Bob", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Fred", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Trevor", Lastname = "Smith", Age=15 },
new Author{ Firstname = "Brian", Lastname = "Smith", Age=11 },
new Author{ Firstname = "Billy", Lastname = "Smith", Age=11 },
};
var authorsListExcept = new List<Author>()
{
new Author{ Firstname = "Bob", Lastname = "Smith", Age=12 },
new Author{ Firstname = "Fred", Lastname = "Smith", Age=12 },
};
var authorsList2 = authorsList
.Except(authorsListExcept, new AuthorUpdatedComparer()).ToList();
}
}
class Author
{
public string Firstname { get; set; }
public string Lastname { get; set; }
public int Age { get; set; }
}
class AuthorUpdatedComparer : IEqualityComparer<Author>
{
public bool Equals(Author x, Author y)
{
return x.Age >= y.Age;
}
public int GetHashCode(Author obj)
{
//Check whether the object is null
if (Object.ReferenceEquals(obj, null)) return 0;
int FirstnameHash = (obj.Firstname ?? "").GetHashCode();
int LastnameHash = (obj.Lastname ?? "").GetHashCode();
int finalResult = FirstnameHash^LastnameHash;
return finalResult;
}
}
Мой результат authorsList2 будет: * Боб Смит с возрастом 20 * Bom Смитом с возрастом 14 * Тревор Смит с 15 лет * Брайан Смит с 11 лет * Билли Смит с 11 лет
Но вместо этого Боб Смит с 14 лет не включен. При отладке я пришел к выводу, что после сравнения с продавцом после того, как Боб Смит с возрастом 20 начал использовать его, был исключен сравнитель, после чего Боб был моложе 20.
Это странное поведение, на мой взгляд, оно должно исключили только тех, кто моложе или с тем же возрастом, что и те, которые включены в список авторовListExcept. Я пытался читать документацию MSDN и то, что я хочу, это должно быть должно произойти: шрифт: http://msdn.microsoft.com/en-us/library/bb336390(v=vs.100).aspx
Любой человек может мне помочь? Спасибо, Hugo Сальгадо
Ваша реализация Equals не имеет для меня большого смысла. > = зависит от предыдущей сортировки списка. При сравнении 20-14 вы получаете разные результаты, зависящие от того, к какому параметру x или y они идут. С этим нет никаких шансов получить стабильные результаты. В уравнении EqualityComparer сравните для равенства и ничего другого. – Ralf
Есть ли у вас другой sugestion делать то, что я хочу. Я хочу изменить свой код, если есть лучший подход. –
@HugoSalgado: Даже не понятно, чего вы хотите достичь здесь. Просьба представить ожидаемый результат и объяснить его. Прямо сейчас, то, что у вас прямо под исходным кодом, не имеет для меня никакого смысла вообще и, в частности, нет ни одного «Бом Смита». –