2012-03-27 23 views
0

我有枚舉對象幾個普查員的LINQ過濾

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

還列表。對象具有基於ConversionResults的Enum屬性。

我試圖消除它具有枚舉所有對象「ConversionResults.Validated,ConversionResults.ValidationFailed,ConversionResults.Uploaded」,但代碼不工作,對象不會被刪除。

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

'RemoveAll'不是以LINQ開頭......如果你想使用LINQ,你應該使用'Where'。但是除此之外,你是否試圖用這些標誌中的*任意*或全部*這些標誌去除元素? – 2012-03-27 11:52:11

+0

我想刪除所有具有任何枚舉值的對象。 – Tomas 2012-03-27 11:55:35

+0

對,這不是'HasFlag'的作用。當我從午餐回來的時候會發佈一個答案,如果沒有其他人有...... – 2012-03-27 11:56:24

回答

3

有兩件事情需要改變。

首先,你需要重新定義枚舉如下:本身

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

[Flags]屬性不分配的兩個功率來枚舉值(這是必要的,如果枚舉值應作爲標誌);你仍然需要手動完成。屬性(AFAIK)僅影響.ToString()方法在用於返回枚舉值的字符串表示形式時的工作方式。

其次,在.RemoveAll()方法,你的謂語必須這樣形成的:

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

這將刪除那些有任何的ValidatedValidationFailedUploaded標誌上的項目。

0

您可以將這些標誌組合在一起使用OR進行匹配。要確定一個給定的標誌是否與該組合相匹配,將其與該組合進行AND並且如果結果是相同的標誌,則它匹配。

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

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

HasFlag方法可行,但在檢查大量標誌時會變得冗長。