【问题标题】:LINQ Query skips without exception. Why?LINQ 查询毫无例外地跳过。为什么?
【发布时间】:2009-02-16 15:08:18
【问题描述】:

我有一个获取嵌套数组作为参数的方法:

Number[][] data 

其中 Number 是我非常简单的类,它继承自 INotifyPropertyChange。

然后我有这样的声明:

double[] max = (double[])data.Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max());

当我试图在调试器中查看它时,它只是跳过它,整个方法虽然没有弹出异常。

答案是什么?还有什么更好的方法。

当然,我可以使用循环——但它看起来又脏又长。所以LINQ是首选

附:我正在使用 VS2008 SP1

【问题讨论】:

    标签: c# .net linq lambda


    【解决方案1】:

    您确定 Select 方法返回一个数组吗?铸造 + 泛型 = 代码异味

    试试这个:

    double[] max = data
      .Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max())
      .ToArray();
    

    转换方法 - (ToArray) 分配一个新数组并填充它。受方法的限制。

    向下转换 - 允许您将 reference 的类型更改为对象实例。 仅允许实际实例类型或实例类型继承自的某些类型。其他任何情况都会导致运行时异常。

    显式转换运算符 - 使用向下转换的语法,达到转换的效果。这真的是一种转换方法。对于试图理解演员表的人来说,这是一个无穷无尽的困惑来源。

    考虑这段代码:

    // reference type is IEnumerable<string>, instance type is string[]
    IEnumerable<string> myArray =
      new string[3] { "abc", "def", "ghi" };
    // reference type is IEnumerable<string>, instance type is ???
    IEnumerable<string> myQuery = myArray
      .Select(s => s.Reverse().ToString());
    
    //Cast - works
    string[] result = (string[]) myArray;
    //Cast - runtime exception: System.InvalidCastException
    result = (string[])myQuery;
    //Conversion - works
    result = myQuery.ToArray();
    

    为什么在 vs 中没有出现运行时异常?我不知道。

    【讨论】:

    • 不,不是。它返回 IEnumerable,但我认为强制转换和 ToArray() 正在做同样的事情——将 IEnumerable 转换为 Array。您的方法确实有效,但有什么区别?为什么会出现这种奇怪的 Visual Studio 行为?
    • 是的,我真的认为它会使用转换运算符。谢谢回答)
    【解决方案2】:

    通常这种行为意味着您的源代码文件不是最新的。尝试从输出目录中删除所有 .bin 和 .pdb 文件并重建。

    【讨论】:

      【解决方案3】:

      您是否尝试过迭代 max ? 我认为这没有抛出,因为您没有遍历请求的结果(Linq 仅在第一次调用 GetEnumerator 后才启动您的请求。

      ToArray 方法遍历请求的可枚举项,并复制数组中的所有内容。我认为这就是区别。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        相关资源
        最近更新 更多