Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多个枚举数的Linq滤波器_Linq_C# 4.0_Enumeration - Fatal编程技术网

多个枚举数的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
所做的。当我吃完午饭回来的时候,如果没有其他人。。。