因此,我使用一组枚举来确定4个插槽的值。有一个叫做无,然后有4个叫火,土,水,空气。插槽的值保存在一个整数字典中,作为索引,枚举值作为值。我想检查这本词典的值,看看是否存在某些组合。我不确定如何在没有硬编码的情况下最有效地做到这一点。我知道如何存储组合,但我不确定如何去有效地检查这些值。检查组合值
这个想法是,如果组合是火灾,火灾,火灾,火灾,那么它会启动某个事件/功能。
因此,我使用一组枚举来确定4个插槽的值。有一个叫做无,然后有4个叫火,土,水,空气。插槽的值保存在一个整数字典中,作为索引,枚举值作为值。我想检查这本词典的值,看看是否存在某些组合。我不确定如何在没有硬编码的情况下最有效地做到这一点。我知道如何存储组合,但我不确定如何去有效地检查这些值。检查组合值
这个想法是,如果组合是火灾,火灾,火灾,火灾,那么它会启动某个事件/功能。
我对字典有点困惑,因为它听起来像你只是用键来表示序列。我猜这是一个SortedDictionary<int, Elements>
(虽然它可能并不重要)。但首先:
要比较任何两个列表,您可以使用SequenceEquals
。
比方说,这是你的枚举:
enum Elements { None, Fire, Earth, Water, Air }
比方说,你正在检查的组合是:
var elementsToMatch = new Elements[] { Elements.Fire, Elements.Fire, Elements.Fire };
你可以这样做:
var matches = dictionary.Values.SequenceEquals(elementsToMatch);
这是真的如果两个集合包含相同序列中的相同元素,则为false。
如果顺序并不重要,只是元素的组合,那么你可以先对它们进行排序:
var matches = dictionary.Values.OrderBy(v=>v)
.SequenceEquals(elementsToMatch.OrderBy(e=>e));
是一个Dictionary
要做到这一点?
你可以这样做:
var elements = new Dictionary<int, Elements>(); // or SortedDictionary
elements.Add(0, Elements.None);
elements.Add(1, Elements.Fire);
// etc.
或者你可以这样做:
var elements = new Elements[] { Elements.None, Elements.Water };
或者使用List<Elements>
。
在任何情况下,你访问它会是完全一样的方式:
elements[0]
elements[1]
// etc
与字典它可能是一个关键的可能会丢失。可能有一个elements[0]
和elements[2]
但没有elements[1]
。
如果Dictionary的唯一原因是为每个元素提供一个位置,那么你可以使用一个数组或一个列表,因为每个元素都可以被它的位置引用。
谢谢。这帮助了我很多,是的,我像你说的那样从字典中转换过来。当时我脑子里有一个想法,但我没有评论它为什么我使用了一本字典,所以除非我找到一个不使用数组/列表的理由,否则不好使用它们,不要再使用它 –