2012-03-27 15 views
0

Ich habe enumeratorLinq Filter durch mehrere Enumeratoren

[Flags] 
    public enum ConversionResults 
    { 
     Added, Validated, ValidationFailed, Uploaded, Processing, Converted, ConversionFailed 
    } 

auch Liste von Objekten. Objekte verfügen über eine Enum-Eigenschaft basierend auf ConversionResults.

Ich versuche, alle Objekte zu entfernen, die Aufzählungen „ConversionResults.Validated, ConversionResults.ValidationFailed, ConversionResults.Uploaded“ aber Code nicht arbeiten muß, ist das Objekt nicht entfernt.

ConversionModelList.RemoveAll(p.Result.HasFlag(ConversionResults.Validated | ConversionResults.ValidationFailed | ConversionResults.Uploaded)) 
+0

'RemoveAll' ist nicht LINQ zum Starten mit ... Wenn Sie LINQ verwenden möchten, sollten Sie' Where' verwenden. Aber abgesehen davon, versuchen Sie, Elemente mit * irgendwelchen * dieser Flags oder * alle * von ihnen zu entfernen? –

+0

Ich möchte alle Objekte entfernen, die einen Enum-Wert haben. – Tomas

+0

Richtig, das ist nicht was 'HasFlag' tut. Werde eine Antwort schreiben, wenn ich vom Mittagessen zurückkomme, wenn niemand sonst ... –

Antwort

3

Es gibt zwei Dinge, die Sie ändern müssen.

Zuerst müssen Sie Ihre Enum neu zu definieren, wie folgt:

[Flags] 
public enum ConversionResults 
{ 
    Added = 1, 
    Validated = 2, 
    ValidationFailed = 4, 
    Uploaded = 8, 
    Processing = 16, 
    Converted = 32, 
    ConversionFailed = 64 
} 

[Flags] Attribut selbst zuweisen keine Leistung von zwei Werten ENUM (was notwendig ist, wenn Enum-Werte als Flags dienen sollte); Sie müssen das immer noch manuell tun. Das Attribut (AFAIK) wirkt sich nur auf die Methode aus, mit der die .ToString()-Methode verwendet wird, wenn die Zeichenfolgendarstellung von Enum-Werten zurückgegeben wird.

Zweitens in .RemoveAll() Methode, muss Ihr Prädikat wie folgt gebildet werden: Das

ConversionModelList.RemoveAll(p => 
    p.Result.HasFlag(ConversionResults.Validated) | 
    p.Result.HasFlag(ConversionResults.ValidationFailed) | 
    p.Result.HasFlag(ConversionResults.Uploaded)); 

werden diese Elemente entfernen, die auf einem der Validated, ValidationFailed und Uploaded Flaggen haben.

0

Sie können die Flags miteinander kombinieren, indem Sie ein OR verwenden. Um zu bestimmen, ob ein gegebenes Flag mit der Kombination übereinstimmt, UND mit der Kombination und wenn das Ergebnis das gleiche Flag ist, stimmt es überein.

var flagsToMatch = ConversionResults.Validated | 
        ConversionResults.ValidationFailed | 
        ConversionResults.Uploaded; 

list.RemoveAll(p => p.Result == (p.Result & flagsToMatch)); 

Der HasFlag Ansatz funktioniert, kann aber langwierig werden, wenn sie gegen eine Vielzahl von Fahnen zu überprüfen.