有人能解释一下为什么以下的LINQ查询会抛出InvalidOperationException异常吗?(不要说列表没有元素,我要查找的值总是存在于集合中)
我在代码中添加了lastNumber字段来帮助调试,当程序崩溃时,您可以看到该值存在于集合中。
PS 问题不在于随机变量,我已经删掉了参数并在方法内部创建了一个新的局部随机数,但问题仍然存在。
更新 事实证明,您不需要循环就能使其崩溃。如果您多次运行程序,将再次出现错误。
class Program
{
static int lastNumber;
static void Main()
{
int loopCount = 100; int minValue = 1; int maxValue = 10000;
var numbers = Enumerable.Range(minValue, maxValue).ToList();//or ToArray();
Random random = new Random();
for (int i = 0; i < loopCount; i++)
{
//.First() throws the exception but it is obvious that the value exists in the list
int x = numbers.Where(v => v == NewMethod(minValue, maxValue, random)).First();
}
Console.WriteLine("Finished");
Console.ReadLine();
}
private static int NewMethod(int minValue, int maxValue, Random random)
{
var a1 = random.Next(minValue + 1, maxValue - 1);
lastNumber = a1;
return a1;
}
}
只有在我在lambda表达式中调用NewMethod时才会出现问题。
如果这样做,它就能正常工作。
int temp=NewMethod(minValue, maxValue, random);
int x = numbers.Where(v => v == temp).First();
我在代码中添加了lastNumber字段来帮助调试,当程序崩溃时,您可以看到该值存在于集合中。
PS 问题不在于随机变量,我已经删掉了参数并在方法内部创建了一个新的局部随机数,但问题仍然存在。
更新 事实证明,您不需要循环就能使其崩溃。如果您多次运行程序,将再次出现错误。
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
class Program
{
static int lastNumber;
static void Main()
{
int minValue = 1, maxValue = 100000;
var numbers = Enumerable.Range(minValue, maxValue).ToArray();
//Crashes sometimes
int x = numbers.Where(v => v == NewMethod(minValue, maxValue)).First();
Console.WriteLine("Finished");
Console.ReadLine();
}
private static int NewMethod(int minValue, int maxValue)
{
Random random = new Random();
var a1 = random.Next(minValue + 1, maxValue - 1);
lastNumber = a1;
return a1;
}
}