Laden...

Intersect zwischen zwei Listen bestehend aus Flags

Erstellt von _Bugrick_ vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.329 Views
_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 4 Jahren
Intersect zwischen zwei Listen bestehend aus Flags

Hallo zusammen,

ich habe zwei Listen und möchte feststellen können, ob die eine Liste die andere abdeckt. Einer der Listen besteht jedoch aus Flags. Offenbar kommt die Intersect-Linq-Funktion damit nicht klar, denn ich erhalte im Beispiel hier unten das Ergebnis, dass nur einer der Werte in der anderen Liste enthalten ist:


[Flags]
public enum Waehrung
{
  Silber = 1,
  Gold = 2,
  Platin = 4
}

List<Waehrung> lstPreis = new List<Waehrung>();
lstPreis.Add(Waehrung.Gold);
lstPreis.Add(Waehrung.Gold);

List<Waehrung> lstKonto = new List<Waehrung>();
lstKonto.Add(Waehrung.Silber | Waehrung.Gold);
 lstKonto.Add(Waehrung.Gold);

List<Waehrung> lstBezahlbar = lstKonto.Intersect(lstPreis).ToList();

Meine Frage ist nun, ob es dennoch eine elegante und einfache Lösung gibt oder ob ich selbst eine Prüfroutine schreiben muss.

Wäre für Hinweise sehr dankbar!

4.931 Beiträge seit 2008
vor 4 Jahren

Du könntest einen IEqualityComparer<TSource> als weiteren Parameter angeben, wie in LINQ Intersect Operator beschrieben.

In der Equals-Methode benutzt du dann Enum.HasFlag.

_
_Bugrick_ Themenstarter:in
48 Beiträge seit 2011
vor 4 Jahren

Hey Th69,

danke für deine Antwort.

Das geht tatsächlich, wenn man die Listen vor dem Vergleich sortiert, sonst nimmt die Methode den ersten Treffer und hebelt unter Umständen andere potentielle Matches aus, wie es hier passieren würde:


List<Waehrung> lstPreis = new List<Waehrung>();
lstPreis.Add(Waehrung.Silber);
lstPreis.Add(Waehrung.Gold);

List<Waehrung> lstKonto = new List<Waehrung>();
lstKonto.Add(Waehrung.Silber | Waehrung.Gold);
lstKonto.Add(Waehrung.Silber);

Außerdem muss die GetHashCode-Methode im eigenen EqualityComparer immer einen konstanten Wert zurückgeben, sonst springt man nie ins Equals um auf die Flags zu prüfen.

Ich hoffe ich kann so erst einmal fahren, danke!