所以,我正在使用一组枚举来确定4个插槽的值。有一个叫做无,然后有4个叫火,土,水,空气。时隙的值保存在整数字典中作为索引,枚举作为值。我想检查这个字典的值,看看是否存在某些组合。如果不对每种情况进行硬编码,我不确定如何最有效地做到这一点。我知道如何存储组合,但我不确定如何有效地检查这些值。
这个想法是,如果组合是火,火,火,火,那么它会引发某个事件/功能。
答案 0 :(得分:0)
我对字典感到有些困惑,因为听起来你只是用键来指示序列。我猜这是一个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);
如果两个集合在同一序列中包含相同的元素,则为true,否则为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的唯一原因是为每个元素提供一个位置,那么你可以使用一个数组或一个列表,因为每个元素都可以被它的位置引用。