Frage

Ich habe mehrere Klassen in meiner Bewerbung, die alle a haben Name Eigenschaft, die ich als Vergleichsgrundlage verwenden möchte (Distinct(), etc.). Da ich immer vergleiche Name, Ich beschloss, eine Schnittstelle zu extrahieren, ISomeComparedStuff, was einfach eine hat Name Eigenschaft, dass alle meine anderen Klassen implementieren. Ich habe eine Vergleichskurs als solche eingerichtet:

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 codieren:

public class SomeStuff : ISomeComparedStuff
{
  ...
}

public class SomeMoreStuff : ISomeComparedStuff
{
  ...
}

var someStuff = GetSomeStuff().Distinct(new MyComparer);
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer);

Ich bekomme einen Gussfehler (SomeStuff zu ISomeComparedStuff). Gibt es eine Möglichkeit, dies zu tun, also brauche ich nur einen Vergleichen der Klasse, sonst müsste ich für jeden meiner Klassen einen erstellen (obwohl ich immer vergleichen werde Name)?

Hinweis: Ich verstehe diese Frage "Titel" braucht Hilfe. Alle Vorschläge wären großartig.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob dies eine gute Lösung ist oder nicht, aber wie wäre es, wenn ich MyParer zu einer generischen Klasse machen würde?

public class MyComparer<T> : IEqualityComparer<T>
    where T: ISomeComparedStuff
{
     public bool Equals(T x, T y)
     {
      return x.Name == y.Name;
     }

     public int GetHashCode(T obj)
     {
      return obj.Name.GetHashCode();
     }
}

Nachteil ist, dass Sie eine geeignete Version neu aufbauen müssen:

var someStuff = GetSomeStuff().Distinct(new MyComparer<SomeStuff>());
var someMoreStuff = GetSomeMoreStuff().Distinct(new MyComparer<SomeMoreStuff>());

Wenn Sie ein wenig erweitern, können Sie auch eine neue Erweiterungsmethode wie folgt erstellen:

public static IEnumerable<T> DistinctByName<T>(this IEnumerable<T> values)
    where T: ISomeComparedStuff
{
    return values.Distinct(new MyComparer<T>());
}

Andere Tipps

Vielleicht so etwas wie:

var someStuff = GetSomeStuff().Cast<ISomeComparedStuff>().Distinct(new MyComparer);

Oder den Nichtgenerikum verwenden IEqualityComparer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top