【问题标题】:IEnumerable<T> InvalidCastExceptionIEnumerable<T> InvalidCastException
【发布时间】:2016-07-20 02:25:03
【问题描述】:

考虑以下几点:

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

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

【问题讨论】:

  • 什么是_bonusTriggerCountSetting 定义在哪里
  • 我知道我忘记了什么。谢谢,我已经更新了帖子
  • 详细说明您的错误。你说错误在“_result.Type |= ResultType.Bonus;”但没有详细说明
  • @MichaelMao 我没有,它上面的行给出了错误。但是,我已经将它更新为更具体地说它的 query.Count() 给出了错误。我也确实在代码sn-p下面的段落中解释了它。
  • 你的_result.Result是什么?给出一个能真正运行并抛出异常的代码

标签: c# linq ienumerable


【解决方案1】:

resultint[] 的数组。但稍后在您的查询中,您声明它拥有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;

【讨论】:

  • 我已经更新了问题以包括代码最后应该做什么。
  • 我没有意识到 count 可以这样使用。但我需要resultsymbolList 中的每个SymbolType.Bonus 匹配,并查找每个符号是否出现超过_bonusTriggerCountSetting 次。
【解决方案2】:

resultint 类型的锯齿状数组,这意味着 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
    }

【讨论】:

  • 智能感知显示queryIEnumberable &lt;int&gt; 类型有什么原因吗?
  • 那是因为您在查询中明确提到了int 类型。
  • 啊,我明白了。我真是太笨了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多