Qualcuno può spiegarmi perché la seguente query LINQ genera una InvalidOperationException?
(Non dire che la lista non ha elementi, il valore che sto cercando sempre esiste nella collezione)La sequenza non contiene elementi
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;
}
}
Il problema appare solo quando chiamo newMethod dentro la mia lambda expession.
Se fare questo funziona
int temp=NewMethod(minValue, maxValue, random);
int x = numbers.Where(v => v == temp).First();
ho aggiunto il campo lastNumber per aiutare il debug del codice, si può vedere che il valore esiste nella collezione quando si blocca
PS
Il problema non è il variabile casuale, ho rimosso il parametro e creare un nuovo locale casuale all'interno del metodo, ma il problema esiste ancora
Aggiorna
risulta fuori che non è necessario il ciclo per farlo crash. Se si esegue il programma molte volte si otterrà l'errore di nuovo
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;
}
}
Per quanto ne so non puoi utilizzare un metodo "complesso" all'interno dell'espressione lamda, solo le cose che possono essere convertite in istruzioni. http://stackoverflow.com/questions/1883920/call-a-function-for-each-value-in-a-generic-c-sharp-collezione –
@ZivWeissman È possibile chiamare i metodi "complessi" - quella domanda era parlando di metodi _con effetti collaterali_. –