Я пытаюсь использовать флаги для фильтрации коллекции и извлечения определенных объектов.
Возможно, пример покажет проблему.
Я определил класс и перечисление.
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 объекта из примеров.