Linq过滤几个枚举器

时间:2012-03-27 11:50:49

标签: linq c#-4.0 enumeration

我有普查员

   [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)) 

2 个答案:

答案 0 :(得分:3)

您需要更改两件事。

首先,您需要重新定义枚举,如下所示:

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

[Flags]属性本身不会将2的幂分配给枚举值(如果枚举值应该用作标志,则必须这样做);你还需要手动完成。属性(AFAIK)仅影响.ToString()方法在用于返回枚举值的字符串表示时的工作方式。

其次,在.RemoveAll()方法中,您的谓词需要像这样形成:

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

这将删除那些包含ValidatedValidationFailedUploaded个标记的项目。

答案 1 :(得分:0)

您可以使用OR组合标记以匹配在一起。要确定给定标志是否与组合匹配,并将其与组合匹配,如果结果是相同的标志,则匹配。

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

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

HasFlag方法有效,但在检查多个标志时会变得很长。