myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns
» Datenschutzerklärung
» Impressum

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » Basistechnologien und allgemeine .NET-Klassen » Intersect zwischen zwei Listen bestehend aus Flags
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Intersect zwischen zwei Listen bestehend aus Flags

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
_Bugrick_ _Bugrick_ ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2011
Beiträge: 48
Entwicklungsumgebung: Visual Studio 2010/2013


_Bugrick_ ist offline

Intersect zwischen zwei Listen bestehend aus Flags

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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!

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von _Bugrick_ am 15.05.2019 13:34.

15.05.2019 13:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Th69
myCSharp.de-Poweruser/ Experte

avatar-2578.jpg


Dabei seit: 01.04.2008
Beiträge: 3.239
Entwicklungsumgebung: Visual Studio 2015/17


Th69 ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
15.05.2019 13:50 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
_Bugrick_ _Bugrick_ ist männlich
myCSharp.de-Mitglied

Dabei seit: 16.03.2011
Beiträge: 48
Entwicklungsumgebung: Visual Studio 2010/2013

Themenstarter Thema begonnen von _Bugrick_

_Bugrick_ ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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!
15.05.2019 16:20 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum
Antwort erstellen


© Copyright 2003-2019 myCSharp.de-Team | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.05.2019 15:41