У меня вопрос по поводу выражений Linq, определенных в цикле.Следующая программа LinqPad C # демонстрирует поведение:
void Main()
{
string[] data=new string[] {"A1", "B1", "A2", "B2" };
string[] keys=new string[] {"A", "B" };
List<Result> results=new List<Result>();
foreach (string key in keys) {
IEnumerable<string> myData=data.Where (x => x.StartsWith(key));
results.Add(new Result() { Key=key, Data=myData});
}
results.Dump();
}
// Define other methods and classes here
class Result {
public string Key { get; set; }
public IEnumerable<string> Data { get; set; }
}
По существу, «A» должно иметь данные [A1, A2], а «B» должно иметь данные [B1, B2].
Однако, когда вы запускаете это «A», получает данные [B1, B2], как и BIe, последнее выражение вычисляется для всех экземпляров Result.
Учитывая, что я объявил «myData» внутри цикла, почемуведя себя так, как будто я объявил это вне цикла?Например, он действует так, как я и ожидал, если бы я сделал это:
void Main()
{
string[] data=new string[] {"A1", "B1", "A2", "B2" };
string[] keys=new string[] {"A", "B" };
List<Result> results=new List<Result>();
IEnumerable<string> myData;
foreach (string key in keys) {
myData=data.Where (x => x.StartsWith(key));
results.Add(new Result() { Key=key, Data=myData});
}
results.Dump();
}
// Define other methods and classes here
class Result {
public string Key { get; set; }
public IEnumerable<string> Data { get; set; }
}
Я получаю желаемый результат, если форсирую оценку внутри итерации, это не мой вопрос.
Я спрашиваю, почему «myData», по-видимому, распределяется между итерациями, учитывая, что я объявил его в рамках одной итерации?
Кто-то вызывает Джона Скита ...; ^)