2012-03-30 14 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 

どのように私はこれに近づいているshoooldについての提案はありますか?私もitemsAll.Except(itemsNew)を試しましたが、正しい結果が得られません!

答えて

1

を働くかもしれないが、あなたは、2つの項目が等しいときに知る方法は等値比較子を提供する必要があります。あなたの質問に

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

あなたがあなた自身の比較子を使用していないように見えますので、彼らががないメモリ(最も可能性が高い)で同じオブジェクトが、あるかどうかを確認するための項目を比較しているものあなたがしようとしている。

データベースのIDでオブジェクトを比較する必要があります。つまり、自分自身を比較者にする必要があります。

例:

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

または

var itemsOld = itemsAll.Where(x => !itemsNew.Exists(y => y.Id == x.Id)); 
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

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

} 
は、私はそう 流暢な構文を好みます
関連する問題