Я пытаюсь сравнить два списка С #, содержащих сложные объекты. Я знаю, что подобные вопросы задавались и раньше, но это немного другое. Я буквально следую примеру MSDN: https : //msdn.microsoft.com/en-us/library/bb300779 (v = vs.110) .aspx

public class ProductA
{ 
    public string Name { get; set; }
    public int Code { get; set; }
}

public class ProductComparer : IEqualityComparer<ProductA>
{

    public bool Equals(ProductA x, ProductA y)
    {
        //Check whether the objects are the same object. 
        if (Object.ReferenceEquals(x, y)) return true;

        //Check whether the products' properties are equal. 
        return x != null && y != null && x.Code.Equals(y.Code) && x.Name.Equals(y.Name);
    }

    public int GetHashCode(ProductA obj)
    {
        //Get hash code for the Name field if it is not null. 
        int hashProductName = obj.Name == null ? 0 : obj.Name.GetHashCode();

        //Get hash code for the Code field. 
        int hashProductCode = obj.Code.GetHashCode();

        //Calculate the hash code for the product. 
        return hashProductName ^ hashProductCode;
    }
}

Затем методом Except удалите "яблоко" 9 из списка.

ProductA[] fruits1 = { new ProductA { Name = "apple", Code = 9 }, 
                       new ProductA { Name = "orange", Code = 4 },
                        new ProductA { Name = "lemon", Code = 12 } };

ProductA[] fruits2 = { new ProductA { Name = "apple", Code = 9 } };

//Get all the elements from the first array //except for the elements from the second array. 
IEnumerable<ProductA> except = fruits1.Except(fruits2);

foreach (var product in except)
    Console.WriteLine(product.Name + " " + product.Code);

Этот код должен дать следующий результат: апельсин 4 лимон 12

Мой нет и распечатывает следующее: яблоко 9 апельсин 4 лимон 12

c#
4
Aaron Thompson 30 Июн 2017 в 13:31

1 ответ

Лучший ответ

Похоже, в документации MSDN есть ошибка: https : //msdn.microsoft.com/en-us/library/bb300779 (v = vs.110) .aspx

Вызов метода Except должен использовать IEqualityComparer:

//Get all the elements from the first array //except for the elements from the second array. 
ProductComparer pc = new ProductComparer();
IEnumerable<ProductA> except = fruits1.Except(fruits2, pc);
6
Aaron Thompson 30 Июн 2017 в 13:31
1
В документации не используется IEqualityComparer в вызове метода Except (сразу под комментарием).
 – 
Aaron Thompson
30 Июн 2017 в 13:41
Ах да, теперь я понимаю.
 – 
Chris
30 Июн 2017 в 13:45