考虑以下内容:
int _bonusTriggerCountSetting = 5;
int [][] result = new int[][]
{
new int[] {1,2,3},
new int[] {4,5,6},
new int[] {7,8,9}
};
var bonusList = Enumerable.Range (0, _symbolList.Count)
.Where (i => _symbolList [i].Type == SymbolType.Bonus);
foreach (var bonus in bonusList) {
var query = from int item in result
where item == bonus
select item;
if (query.Count () >= _bonusTriggerCountSetting) { // query.Count () gives the error below
_result.Type |= ResultType.Bonus;// bitwise enum
break;
}
}
运行时错误:
InvalidCastException:无法从源类型强制转换为目标类型。
让我困惑的是bonusList和query都是IEnumerable<int>
,但query给出了一个错误,而不是bonusList。我已经尝试对这两种方法进行foreach,结果仍然存在,即bonusList工作正常,但查询不正常。
还有没有一种方法可以在一步而不是两步中查询?该代码应该将结果与bonusList进行比较,以查看结果是否在bonusList中包含超过_bonusTriggerCountSetting
个"奖金"类型的符号。
result
是int[]
的数组。但稍后在查询中,您声明它包含int
。
var query = from int item in result
where item == bonus
select item;
相当于:
var query = result.Cast<int>().Where(item => item == bonus);
这显然不是错误。
据我所知,您只是想确定某个列表是否至少包含SymbolType.Bonus
类型的_bonusTriggerCountSetting
符号。你可以简单地做:
var count = _symbolList.Count(s => s.Type == SymbolType.Bonus);
var result = count >= _bonusTriggerCountSetting;
result
是int
类型的锯齿状数组,这意味着linq表达式中的item
是int数组(而不是int
),将其强制转换为int将导致无效的强制转换异常。
不确定的用例到底是什么,如果你在嵌套数组中寻找任何匹配的元素,你可以这样做。
foreach (var bonus in bonusList) {
var query = from items in result
where items.Any(x=>x == bonus) // To verify at least there is one matching element.
select items;
// otehr logic
}