C# LINQ查询毫无例外地跳过。为什么?
我有一个将嵌套数组作为参数的方法:C# LINQ查询毫无例外地跳过。为什么?,c#,.net,linq,lambda,C#,.net,Linq,Lambda,我有一个将嵌套数组作为参数的方法: Number[][] data 其中Number是从INotifyPropertyChange继承的非常简单的类 然后我有这样一句话: double[] max = (double[])data.Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max()); 当我试图在调试器中查看它时,它只是跳过它,整个方法尽管没有异常弹出 答案是什么?还有更好的方法是什么 当然,我可以使用循环,
Number[][] data
其中Number是从INotifyPropertyChange继承的非常简单的类
然后我有这样一句话:
double[] max = (double[])data.Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max());
当我试图在调试器中查看它时,它只是跳过它,整个方法尽管没有异常弹出
答案是什么?还有更好的方法是什么
当然,我可以使用循环,但它看起来又脏又长。所以LINQ更受欢迎
另外,我使用的是VS2008 SP1,通常这种行为意味着源代码文件不是最新的。尝试从输出目录中删除所有.bin和.pdb文件并重新生成。是否确定Select方法返回数组?铸造+泛型=代码气味 试试这个:
double[] max = data
.Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max())
.ToArray();
转换方法-(ToArray)分配一个新数组并填充它。受方法的限制 向下转换-允许您将引用的类型更改为对象实例。 仅允许实际实例类型,或实例类型继承自的某些类型。其他任何操作都会导致运行时异常 显式转换运算符-使用向下转换的语法,以实现转换效果。这实际上是一种转换方法。对于试图理解铸造的人们来说,这是一个无止境的困惑之源 考虑以下代码:
// 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();
//引用类型为IEnumerable,实例类型为string[]
IEnumerable数组=
新字符串[3]{“abc”、“def”、“ghi”};
//引用类型为IEnumerable,实例类型为???
IEnumerable myQuery=myArray
.选择(s=>s.Reverse().ToString());
//铸造厂
字符串[]结果=(字符串[])myArray;
//强制转换-运行时异常:System.InvalidCastException
结果=(字符串[])myQuery;
//转换工程
结果=myQuery.ToArray();
为什么在vs中没有出现运行时异常?我不知道。你有没有试着遍历max? 我认为这没有抛出,因为您没有遍历请求的结果(Linq),只有在第一次调用GetEnumerator之后才启动请求
ToArray方法遍历请求的可枚举项,并复制数组中的所有内容。我认为这是不同之处。不,不是。它返回IEnumerable,但我认为casting和ToArray()正在做同样的事情-将IEnumerable转换为数组。您的方法确实有效,但有什么区别?为什么会出现这种奇怪的Visual Studio行为?是的,我真的认为它将使用转换运算符.Thx作为答案)