LINQ: Verwenden .Außer (), die auf Sammlungen von verschiedenen Arten, indem Sie diese Cabrio/vergleichbar?
Gegeben sind zwei Listen von verschiedenen Arten, ist es möglich, diese Arten Cabrio oder zwischen miteinander vergleichbar (z.B. mit einem TypeConverter oder ähnliches), so dass eine LINQ-Abfrage können Sie vergleichen? Ich habe gesehen, ähnliche Fragen auf, SO aber nichts, die Punkte zu machen, die Typen-Cabrio zwischen einander, um das problem zu lösen.
Collection-Typen:
public class Data
{
public int ID { get; set; }
}
public class ViewModel
{
private Data _data;
public ViewModel(Data data)
{
_data = data;
}
}
Gewünschte Verwendung:
public void DoMerge(ObservableCollection<ViewModel> destination, IEnumerable<Data> data)
{
//1. Find items in data that don't already exist in destination
var newData = destination.Except(data);
//...
}
Würde es logisch erscheinen, da ich weiß, wie zu vergleichen, die eine Instanz von ViewModel zu einer Instanz von Daten sollte ich in der Lage, einige Vergleich-Logik, LINQ würde dann verwenden Sie für Anfragen wie .Mit Ausnahme von(). Ist das möglich?
for
Schleife, er war einmal so nützlich, aber, ach, er macht nie den one-liner die Menschen glücklich.Ich bin nicht einverstanden mit der Stimmung, die Sie Ausdrücken. Wir haben Möglichkeiten, code zu schreiben, dass jetzt deutlicher drückt sich die Absicht, ohne sich Gedanken über den Mechanismus.
for
drückt Mechanismen und verdunkelt Absicht. Die LINQ-basierte one-Liner, Sie sind decrying oft (ja, nicht immer) besser ausdrücklichen Absicht und ausblenden Mechanismen. Dies führt zu code, der leichter zu verstehen und zu pflegen.während ich die Aufgabe, alle Funktionen, die Sie werfen in einer Projektion, wie Sie sind, stellt nur eine Annahme von Vorsatz.
Ich nicht Folgen.
Was ist Los mit dir? LINQ ist cool und macht überall gelten. 😉
InformationsquelleAutor James Cadd | 2012-04-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre beste Wette ist, um eine Projektion von
Data
zuViewModel
so, dass man sagen kannwo
f
KartenData
zuViewModel
. Sie benötigen einenIEqualityComparer<Data>
zu.InformationsquelleAutor jason
Ich gehe davon aus, dass die eine Projektion von
Data
zuViewModel
problematisch ist, so biete ich eine andere Lösung neben Jason.Außer verwendet eine hash-set (wenn ich mich Recht erinnere), so können Sie eine ähnliche Leistung, indem Sie Ihre eigenen hashset. Ich gehe auch davon aus, dass Sie die Identifizierung
Data
Objekte als gleich, wenn IhreIDs
gleich sind.Haben Sie vielleicht eine andere Verwendung für eine Sammlung von "B. OldData" an anderer Stelle in der Methode, in dem Fall würden Sie dies tun wollen, statt. Entweder implementieren
IEquatable<Data>
auf Ihre Daten-Klasse, oder erstellen Sie eine benutzerdefinierteIEqualityComparer<Data>
für den hash-set:ViewModel
hat einen KonstruktorData
!Ich meine "problematisch" für die Leistung, oder philosophisch, nicht in Bezug auf herauszufinden, wie man den code zu schreiben. Performance-Weise, die
ViewModel
Klasse erfordern eine Menge anderer Aufwand in der Konstruktion. Philosophisch, es scheint seltsam zu erstellen, die eine Reihe von Objekten nur so können wirExcept
wählen Sie einige Objekte, die nicht bestimmte Kriterien erfüllen.points.All(point => point.IsGoodPoint)
evalutes zutrue
.InformationsquelleAutor phoog
Wenn Sie diese :
Haben Sie zum Projekt 'Daten' auf gleiche Art enthalten in "Ziel", aber mit dem folgenden code könnte man loswerden dieser Einschränkung :
Manche mögen argumentieren, dass der Speicher ineffizient aufgrund der Verwendung eines HashSet. Aber eigentlich ist das Zählbare.Außer-Methode des framework ist das gleiche tun mit einem ähnlichen internen Klasse namens " Set " (ich warf einen Blick durch die Dekompilierung).
InformationsquelleAutor Pataphysicien