Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Intersect zwischen zwei Listen bestehend aus Flags
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

Intersect zwischen zwei Listen bestehend aus Flags

beantworten | zitieren | melden

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!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Bugrick_ am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4175

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers