2012-03-30 69 views
0

我试图根据列表中的项目来构建项目列表。按对象属性从列表中排除项目

  • itemsAll包含所有的产品
  • itemsNew只包含新产品
  • 我想itemsOld只包含老产品(即itemsAll - itemsNew

这是我的方法,这不会返回正确数量的项目。

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),这也不会产生正确的结果!

回答

1

我想你也许可以使用除的方法,但你需要的知道什么时候两个项目都是平等的方法提供一个相等比较。

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; 
    } 

} 
0

这可能会实现

var itemsOld = from a in itemsAll 
       join n in itemsNew on a.Id equals n.Id into ng 
       where !ng.Any() 
       select a; 
1
itemsOld.AddRange(itemsAll.Where(p => !itemsNew.Any(a => a.Id == p.Id))); 
1

我更喜欢流利语法这样:

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

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