2012-03-30 68 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));