Я немного озадачен поведением этого оператора select LINQ. Ниже комментариев LOOK HERE
вы можете увидеть инструкцию LINQ. Этот оператор выбора находится в коллекции employees
. Таким образом, он должен принимать только x
в качестве входного параметра. Из любопытства я передал делегату i
, и он работает. Когда он выполняет итерацию с помощью выбора, он сначала назначает 0, а затем увеличивается на 1. Результат можно увидеть в конце этого сообщения.Где «i» получает свое значение в этой инструкции LINQ?
Где переменная i
получает свое значение? Прежде всего, почему это позволяет мне использовать переменную i
, которая нигде не входит в сферу действия. Он не находится в глобальном масштабе ни в локальном методе Main. Любая помощь ценится, чтобы понять эту тайну.
namespace ConsoleApplication
{
using System;
using System.Collections.Generic;
using System.Linq;
public class Employee
{
public int EmployeedId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
class Program
{
static void Main(string[] args)
{
var employees = new List<Employee>()
{
new Employee() { FirstName = "John", LastName = "Doe" },
new Employee() { FirstName = "Jacob", LastName = "Doe" }
};
// LOOK HERE...
var newEmployees = employees.Select((x, i) => new { id = i, name = x.FirstName + " " + x.LastName });
newEmployees.ToList().ForEach(x => { Console.Write(x.id); Console.Write(" "); Console.WriteLine(x.name); });
Console.ReadKey();
}
}
}
В результате
0 John Doe
1 Jacob Doe
Стоит отметить: вероятно, это хорошая идея назвать этот параметр «лямбда-параметра», поскольку от кода совсем не ясно, что происходит (это своего рода скрытая функциональность). Даже документация немного туповата. –
@RobertHarvey: Хороший момент, я добавил пример. –