Czy ktoś może mi wyjaśnić, dlaczego następujące kwerendy LINQ zgłasza wyjątek InvalidOperationException?
(nie mów, że lista nie zawiera żadnych elementów, wartość, że szukam zawsze istnieje w kolekcji)Sekwencja nie zawiera elementów
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;
}
}
Problem pojawia się tylko wtedy, gdy zadzwonię NewMethod wewnątrz mojego lambda wyrażają dynamiczne.
Jeśli to zrobić to działa
int temp=NewMethod(minValue, maxValue, random);
int x = numbers.Where(v => v == temp).First();
Dodałem pole lastNumber aby pomóc debugowania kodu, można zobaczyć, że wartość istnieje w kolekcji kiedy się zawiesi
PS
Problemem nie jest zmienna losowa, usunąłem parametr i utworzyć nowy lokalny losowo wewnątrz metody, ale problem nadal istnieje
Aktualizacja
okazuje że nie potrzebujesz pętli, aby spowodować awarię. Jeśli uruchomić program wiele razy dostaniesz błędu ponownie
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;
}
}
O ile wiem, nie możesz użyj "złożonej" metody w wyrażeniu lamda, tylko rzeczy, które można przekonwertować na instrukcje. http://stackoverflow.com/questions/1883920/call-a-function-for-each-value-in-a-eneric-c-sharp-collection –
@ZivWeissman Możesz nazwać metody "złożone" - to pytanie mówienie o metodach z efektami ubocznymi_. –