Исключение элементов из списка по свойству объекта - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь создать список элементов на основе их присутствия в списке.

  • itemsAll содержит все продукты
  • itemsNew содержит только новые продукты
  • Я бы хотел, чтобы itemsOld содержал только старые продукты (т.е. itemsAll - itemsNew)

Это был мой подход, который не возвращает правильное числоitems.

var itemsAll = objProductStagingRepository.AllImports(fileId, cid).ToList();

var itemsNew = objProductStagingRepository.DetectNonPresentProductNames(fileId, cid).ToList();

var itemsOld = from t1 in itemsAll where !(from o in itemsNew select o.Id).Contains(t1.Id)
                                        select t1; // this does not work

У кого-нибудь есть какие-либо предложения относительно того, как я должен подходить к этому?Я пробовал itemsAll.Except(itemsNew), что также не дает правильных результатов!

Ответы [ 4 ]

1 голос
/ 30 марта 2012

Я предпочитаю свободный синтаксис , поэтому:

var itemsOld = itemsAll.Where(x => !itemsNew.Any(y => y.Id == x.Id));

или

var itemsOld = itemsAll.Where(x => !itemsNew.Exists(y => y.Id == x.Id));
1 голос
/ 30 марта 2012

Я думаю, что вы, вероятно, могли бы использовать метод Except, но вам нужно было бы предоставить для сравнения метод равенства, чтобы знать, когда два элемента равны.

http://msdn.microsoft.com/en-us/library/bb336390.aspx

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

Вы хотите сравнить объекты по идентификатору базы данных, а это значит, что вам нужно предоставить свой собственный компаратор.

Пример:

public class Item
{
    public int Id { get; set; }
}

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

        if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
            return false;

        return x.Id == y.Id;
    }

    public int GetHashCode(Item value)
    {
        if (Object.ReferenceEquals(value, null)) return 0;

        int hash = value.Id.GetHashCode();

        return hash;
    }

}
1 голос
/ 30 марта 2012
itemsOld.AddRange(itemsAll.Where(p => !itemsNew.Any(a => a.Id == p.Id)));
0 голосов
/ 30 марта 2012

Это может сработать

var itemsOld = from a in itemsAll
               join n in itemsNew on a.Id equals n.Id into ng
               where !ng.Any()
               select a;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...