почему .Except () и Intersect () не работают здесь с использованием LINQ? - PullRequest
2 голосов
/ 06 августа 2010

У меня есть следующий код, который, кажется, не работает:

Контекст: У меня есть два списка объектов:
* listOne имеет 100 записей
* listTwo имеет 70 записей

многие из них имеют одинаковое свойство Id (в обоих списках);

 var listOneOnlyItems = listOne.Except(listTwo, new ItemComparer ());

вот сравнение

public class ItemComparer : IEqualityComparer<Item>
{
    public bool Equals(Item x, Item y)
    {
        if (x.Id == y.Id)
            return true;

        return false;
    }

    public int GetHashCode(Item obj)
    {
        return obj.GetHashCode();
    }
}

после того, как я запустил этот код и посмотрел на результаты

listOneOnlyItems 

все еще имеет 100 записей (должно быть только 30). Кто-нибудь может мне помочь?

также, работает

    IEnumerable<Item> sharedItems = listOne.Intersect(listTwo, new ItemComparer());

возвращает ноль повторных результатов в коллекции sharedItems

Ответы [ 3 ]

6 голосов
/ 06 августа 2010
public int GetHashCode(Item obj)
{
    return obj.Id.GetHashCode();
}

Стоит проверить хотя бы - IIRC GetHashCode () сначала проверяется перед равенством, и если они не имеют одинакового хэша, проверка на равенство не будет беспокоить. Я не уверен, чего ожидать от obj.GetHashCode() - это зависит от того, что вы реализовали в классе Item.

0 голосов
/ 06 августа 2010

Этот код отлично работает:

static void TestLinqExcept()
{
    var seqA = Enumerable.Range(1, 10);
    var seqB = Enumerable.Range(1, 7);
    var seqAexceptB = seqA.Except(seqB, new IntComparer());
    foreach (var x in seqAexceptB)
    {
        Console.WriteLine(x);
    }
}

class IntComparer: EqualityComparer<int>
{
    public override bool Equals(int x, int y)
    {
        return x == y;
    }

    public override int GetHashCode(int x)
    {
        return x;
    }
}

Вам необходимо добавить ключевые слова переопределения в ваши методы EqualityComparer. (Я думаю, что отсутствие переопределения как неявного было ошибкой со стороны разработчиков C #).

0 голосов
/ 06 августа 2010

Подумайте о том, чтобы GetHashCode () возвращал obj.Id.GetHashCode ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...