Ich habe mehrere Klassen in meiner Anwendung, die alle eine Name
Eigenschaft haben, die ich als meine Basis für den Vergleich verwenden möchte (Distinct()
, etc.). Da ich immer auf Name
vergleichen werde, entschied ich mich, eine Schnittstelle zu extrahieren, ISomeComparedStuff
, die einfach eine Name
Property hat, die alle meine anderen Klassen implementieren. Ich habe eine Vergleichsklasse als solche nach oben:Linq Distinct mit einer einzigen Vergleichsklasse (und Schnittstelle)
public class MyComparer : IEqualityComparer<ISomeComparedStuff>
{
public bool Equals(ISomeComparedStuff x, ISomeComparedStuff y)
{
return x.Name == y.Name;
}
public int GetHashCode(ISomeComparedStuff obj)
{
return obj.Name.GetHashCode();
}
}
Das einzige Problem ist, wenn ich versuche, dagegen zu kodieren:
public class SomeStuff : ISomeComparedStuff
{
...
}
public class SomeMoreStuff : ISomeComparedStuff
{
...
}
var someStuff = GetSomeStuff().Distinct(new MyComparer);
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer);
Ich bin ein Gussfehler bekommen (SomeStuff
-ISomeComparedStuff
). Gibt es eine Möglichkeit, dies zu tun, so brauche ich nur eine Vergleichsklasse, sonst müsste ich für jeden meiner Klassen eine erstellen (obwohl ich immer auf Name
vergleichen werde)?
Hinweis: Ich verstehe diese Frage "Titel" braucht Hilfe. Irgendwelche Vorschläge wären großartig.
ich diesen Ansatz mag:
ein wenig erweitern, können Sie auch eine neue Erweiterung Methode wie diese machen könnte (vor allem, wenn es in einer anderen Erweiterungsmethode gekapselt wäre, zB DistinctByName()), aber Sie müssten die Elemente wieder in den ursprünglichen Typ umwandeln, sonst ist das resultierende 'IEnumerable' wahrscheinlich ziemlich nutzlos. –
Ja. Ich wäre besorgt, dass ich nach der Besetzung alle Daten verlieren würde. –
Sie verlieren keine Daten. Übertragungen an eine Schnittstelle sind nicht verlustreich. –