检查实体是否包含通过枚举标志的所有组件

时间:2017-04-27 04:17:54

标签: c#

我正在努力理解这里的迭代部分我将如何检查下面的{{ myArray[0]?.myProperty }} 变量是否具有所有entity条目变量Enum.Component。如果我知道通过comps只有一个组件和基本比较(例如.ForEach),我可以相对直接地实现这一点,但如果我需要检查多个组件,则不能。

我试图更好地理解C#的细微差别,所以我不想用实际的entity.ForEach(comp => Console.WriteLine(comp.COMPONENT == Enum.Component.EXPERIENCE));(在传统的foreach类型中强制执行此操作)方式)或类似的东西,但我真的想了解如何通过这些foreach(var x in exes)函数和使用lambda表达式通过这些对象实现它。因此,我需要一个利用这些东西的答案,除非这在技术上是不可能的,尽管可能是,我在猜测。

IEnumerable

1 个答案:

答案 0 :(得分:2)

您可以通过Flags轻松完成此操作!

https://msdn.microsoft.com/en-us/library/system.flagsattribute(v=vs.110).aspx

首先使用你的枚举:

[Flags]
enum Component {
    None = 0,
    EXPERIENCE = 1 << 0,
    HEALTH = 1 << 1,
    All = (1 << 2) - 1
}

这基本上会将您的值存储为2的幂,其中包含&#39; All&#39;作为所有标志的总和,在这种情况下Exp和Hp是1和2,所以All是3(1 + 2)

现在您可以在实体类中执行此操作:

public  Enum.Component Flags => comps.Select(c => c.Component).Distinct().Sum();
public bool HasAllFlags => Flags == Enum.Component.All;

我们将enum设为所有不同的基数2,所有下一步为-1,这意味着All是所有枚举列表的总和。

然后我们只是总结一下Enums(我们可能必须首先转换为int然后再转换回enum,我不记得你是否可以在C#中将Enums一起添加)并检查它们是否==组件。所有

你去吧!