多个枚举数的Linq滤波器
我有个统计员多个枚举数的Linq滤波器,linq,c#-4.0,enumeration,Linq,C# 4.0,Enumeration,我有个统计员 [Flags] public enum ConversionResults { Added, Validated, ValidationFailed, Uploaded, Processing, Converted, ConversionFailed } 还包括对象列表。对象具有基于ConversionResults的枚举属性 我正在尝试删除所有具有枚举“ConversionResults.Validated、ConversionRe
[Flags]
public enum ConversionResults
{
Added, Validated, ValidationFailed, Uploaded, Processing, Converted, ConversionFailed
}
还包括对象列表。对象具有基于ConversionResults的枚举属性
我正在尝试删除所有具有枚举“ConversionResults.Validated、ConversionResults.ValidationFailed、ConversionResults.Uploaded”的对象,但代码不起作用,不会删除该对象
ConversionModelList.RemoveAll(p.Result.HasFlag(ConversionResults.Validated | ConversionResults.ValidationFailed | ConversionResults.Uploaded))
有两件事你需要改变 首先,您需要按如下方式重新定义枚举:
[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));
这将删除启用了
验证
、验证失败
和上载
标志的项目。有两件事需要更改
首先,您需要按如下方式重新定义枚举:
[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));
这将删除启用了
验证
、验证失败
和上载
标志的项目。您可以使用或组合这些标志以进行匹配。确定给定标志是否与该组合匹配,并与该组合匹配,如果结果是相同的标志,则匹配
var flagsToMatch = ConversionResults.Validated |
ConversionResults.ValidationFailed |
ConversionResults.Uploaded;
list.RemoveAll(p => p.Result == (p.Result & flagsToMatch));
HasFlag
方法可以工作,但在检查多个标志时可能会变得冗长。您可以使用OR将这些标志组合起来进行匹配。确定给定标志是否与该组合匹配,并与该组合匹配,如果结果是相同的标志,则匹配
var flagsToMatch = ConversionResults.Validated |
ConversionResults.ValidationFailed |
ConversionResults.Uploaded;
list.RemoveAll(p => p.Result == (p.Result & flagsToMatch));
hasvag
方法可以工作,但在检查大量标志时可能会变得冗长。RemoveAll
一开始就不是LINQ。。。如果要使用LINQ,应该使用Where
。但除此之外,您是要删除带有这些标志的元素,还是要删除所有这些标志的元素?我想删除所有具有任何enum值的对象。对,这不是HasFlag
所做的。当我吃完午饭回来的时候,如果没有其他人有…RemoveAll
的话,我会发布一个答案。。。如果要使用LINQ,应该使用Where
。但除此之外,您是要删除带有这些标志的元素,还是要删除所有这些标志的元素?我想删除所有具有任何enum值的对象。对,这不是HasFlag
所做的。当我吃完午饭回来的时候,如果没有其他人。。。