«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" }. Количество элементов в результате равно двум.

Задача

Last updated