2012-03-30 17 views
0

Ich versuche eine Liste von Elementen basierend auf ihrer Anwesenheit in einer Liste zu erstellen.Objekte aus einer Liste nach Objekteigenschaften ausschließen

  • itemsAll enthält alle Produkte
  • itemsNew nur neue Produkte enthält
  • ich itemsOld möchte nur alte Produkte enthalten (dh itemsAll - itemsNew)

Das war mein Ansatz, der gibt nicht die korrekte Anzahl an Artikeln zurück.

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 

Hat jemand irgendwelche Vorschläge, wie ich dies approacing sein soll? Ich habe versucht itemsAll.Except(itemsNew), die auch nicht die richtigen Ergebnisse liefert!

Antwort

1

arbeiten Ich glaube, Sie wahrscheinlich die Ausnahme-Methode verwenden könnte, aber Sie würden einen Gleichheitsvergleich für das Verfahren zu schaffen, müssen zu wissen, wann zwei Elemente gleich sind.

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

In Ihrer Frage sieht es aus wie Sie nicht Ihre eigene comparer verwenden, so dass es einen Vergleich der Einzelteile zu sehen, wenn sie das gleiche Objekt im Speicher (höchstwahrscheinlich) sind, die ist nicht was du versuchst es zu tun.

Sie möchten die Objekte nach Datenbankidentität vergleichen, was bedeutet, dass Sie einen eigenen Vergleich angeben müssen.

Beispiel:

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

Dies könnte

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

Ich ziehe die fließend Syntax so:

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

oder

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