IEnumberable <t> InvalidCastException

时间:2016-07-20 02:25:03

标签: c# linq ienumerable

请考虑以下事项:

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和查询都是IEnumerable<int>但是查询给出了错误但没有给出奖励列表。我已经尝试为两者做一个foreach并且结果仍然存在,即bonusList工作正常但查询没有。

还有一种方法可以一步查询,而不是2吗? 该代码应该将结果与bonusList进行比较,以查看结果是否在bonusList中保存了超过_bonusTriggerCountSetting个“奖励”类型符号的数字。

2 个答案:

答案 0 :(得分:0)

resultint[]的数组。但是稍后在您的查询中,您声明它保留int

var query = from int item in result
            where item == bonus
            select item;

相当于:

var query = result.Cast<int>().Where(item => item == bonus);

显然不是错误。

据我了解,您只是想确定某个列表是否至少包含_bonusTriggerCountSetting类型的SymbolType.Bonus符号。你可以这样做:

var count = _symbolList.Count(s => s.Type == SymbolType.Bonus);
var result = count >= _bonusTriggerCountSetting;

答案 1 :(得分:0)

result是一个类型为int的锯齿状数组,这意味着linq表达式中的item是一个int数组( not 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
    }