Фильтр Linq по нескольким счетчикам - PullRequest
0 голосов
/ 27 марта 2012

У меня есть перечислитель

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

и список объектов.У объектов есть свойство Enum, основанное на ConversionResults.

Я пытаюсь удалить весь объект, имеющий перечисления " ConversionResults.Validated, ConversionResults.ValidationFailed, ConversionResults.Uploaded ", но код не работает,объект не удаляется.

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

Ответы [ 2 ]

3 голосов
/ 27 марта 2012

Есть две вещи, которые нужно изменить.

Во-первых, вам нужно переопределить ваше перечисление следующим образом:

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

Это удалит те элементы, которые имеют любой из флагов Validated, ValidationFailed и Uploaded.

0 голосов
/ 27 марта 2012

Вы можете комбинировать флаги для сопоставления друг с другом, используя OR. Чтобы определить, соответствует ли данный флаг комбинации, И это с комбинацией, и если результат является тем же флагом, то он соответствует.

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

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

Подход HasFlag работает, но может стать длинным при проверке многочисленных флагов.

...