«ClosureAndVariable» (Решение)
Ответ
2
Объяснение
Приведённый код примет следующий вид:
class DisplayClass
{
public string startLetter;
public bool Method1(string c)
{
return c.StartsWith(this.startLetter);
}
public bool Method2(string c)
{
return c.StartsWith(this.startLetter);
}
}
void Main()
{
DisplayClass displayClass = new DisplayClass();
var list1 = new List<string> { "Foo", "Bar", "Baz" };
var list2 = list1;
displayClass.startLetter = "F";
IEnumerable<string> source = list2.Where(displayClass.Method1);
displayClass.startLetter = "B";
Console.WriteLine(source.Where(displayClass.Method2).Count());
}
Выполнение запроса начнётся только в самой последней строчке кода. Как можно видеть, для обоих замыканий создался один и тот же вспомогательный класс. Сначала выполнится первый запрос list2.Where(displayClass.Method1)
и вернёт { "Bar", "Baz" }
, т.к. displayClass.startLetter
к моменту исполнения равна "B"
. Далее выполнится запрос source.Where(displayClass.Method2)
, который также вернёт { "Bar", "Baz" }
. Количество элементов в результате равно двум.