myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Basistechnologien und allgemeine .NET-Klassen (https://www.mycsharp.de/wbb2/board.php?boardid=23)
--- Intersect zwischen zwei Listen bestehend aus Flags (https://www.mycsharp.de/wbb2/thread.php?threadid=121874)


Geschrieben von _Bugrick_ am 15.05.2019 um 13:27:
  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:

C#-Code:
[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!


Geschrieben von Th69 am 15.05.2019 um 13:50:
 
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.


Geschrieben von _Bugrick_ am 15.05.2019 um 16:20:
 
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:

C#-Code:
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!


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 25.06.2019 11:30