如何解决如何在具有[Flags]枚举值的自定义对象列表中查找元素
给出这个枚举:
[Flags]
public enum Result
{
None = 0,Draw = 1 << 0,Win = 1 << 1,Loss = 1 << 2,NotLost = Draw | Win,NotWon = Draw | Loss,Any = Draw | Win | Loss
}
和此类:
public class Match
{
public Result Result { get; }
...
}
如何获取对象Match
的列表,其中属性Result
在NotWon
中具有标记List<Match> matches
?
我尝试过matches.FindAll(m => m.Result.HasFlag(Result.NotWon));
,但是它总是空的,而matches.FindAll(m => m.Result.HasFlag(Result.Loss));
可以正常工作。
解决方法
|
运算符是按位或非逻辑或。因此NotWon
的意思是“设置同时设置汲取和损失位的值”。
NotWon
= Draw | Loss
= (1 << 0) | (1 << 2)
= 1 | 4
= 0b0001 | 0b0100
= 0b0101
= 5
。
自Enum.HasFlag
is a shorthand for this & flag == flag
起,如果true
的两位都置位,它将仅求值为m.Result
。如果只设置了一位,它将评估为false。
有两种方法可以让您想到想要的东西:
- 从您的枚举中删除
Not...
个案例。只需检查是否设置了不需要的标志,然后反转结果,即matches.FindAll(m => !m.Result.HasFlag(Result.Win))
。 - 使用
Not...
个案例作为 masks 并检查非零值,例如matches.FindAll(m => (m.Result & Result.NotWon) != 0)
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。