Как использовать флаги, чтобы проверить, соответствует ли что-то из коллекции флагу - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь использовать флаги для фильтрации коллекции и извлечения определенных объектов.

Возможно, пример покажет проблему.

Я определил класс и перечисление.

    public class ExampleFlagsDto
{
    public int FlagId { get; set; }
    public string Name { get; set; }

}


[Flags]
public enum FlagsTypes
{
    None = 0,
    Small = 1 << 0 ,
    Medium = 1 << 1 ,
    Normal = 1 << 2,
    Large = 1 << 3,
    LargeAndNormal = Normal | Large,
    All = Normal | Medium | Small | Large,

}

Затем я построил список в качестве примера и попытался извлечь 2 объекта из списка.

   var examples = new List<ExampleFlagsDto>()
        {
            new ExampleFlagsDto
            {
                FlagId  = (int)FlagsTypes.Normal,
                Name = "First"
            },
            new ExampleFlagsDto
            {
                FlagId  = (int)FlagsTypes.Medium,
                Name = "Second"
            },
            new ExampleFlagsDto
            {
                FlagId  = (int)FlagsTypes.Large,
                Name = "Third"
            },
            new ExampleFlagsDto
            {
                FlagId  = (int)FlagsTypes.Small,
                Name = "Forth"
            },
        };

        var selected = examples.Where(C => C.FlagId == (int)FlagsTypes.LargeAndNormal).ToList();


        foreach (var flag in selected)
        {
            Console.WriteLine(flag.Name);
        }

Конечно, это не работает. Я знаю, что когда дело доходит до бит, (int) FlagTypes.LargeAndNormal приведет к сумме битов Large и Normal. Я понятия не имею, как это должно выглядеть поразрядно, все же.

Я ищу способ изменить

  examples.Where(C => C.FlagId == (int)FlagsTypes.LargeAndNormal).ToList();

к решению, которое привело бы к выбору, имеющему 2 объекта из примеров.

1 Ответ

1 голос
/ 03 июля 2019

Вы можете попробовать это решение:

var selectedAll = examples.Where(C => (C.FlagId & (int)FlagsTypes.All) == (int)C.FlagId).ToList();
...