在哪里"我"在这个LINQ语句中获取它的值?

时间:2014-10-23 22:06:10

标签: c# linq

我对这个选择LINQ语句的行为感到困惑。在LOOK HERE注释之下,您可以看到选择的LINQ语句。该select语句位于employees集合中。因此,它应该只接受x作为输入参数。出于好奇,我将i传递给代表并且它有效。当它遍历select时,它首先指定0然后以1递增。结果可以在本文末尾看到。

变量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();
        }
    }
}

结果是

enter image description here

0 John Doe
1 Jacob Doe

1 个答案:

答案 0 :(得分:5)

Enumerable.Select有一个重载,用于投射序列中元素的当前索引。此外,Enumerable.WhereEnumerable.SkipWhile / TakeWhile也拥有它。您可以像for - 循环中的循环变量一样使用它,这有时很方便。

使用索引创建匿名类型以将长列表分组为4的组的一个示例:

var list = Enumerable.Range(1, 1000).ToList();

List<List<int>> groupsOf4 = list
    .Select((num, index) => new { num, index })
    .GroupBy(x => x.index / 4).Select(g => g.Select(x => x.num).ToList())
    .ToList();  // 250 groups of 4

Where仅选择偶数索引的人:

var evenIndices = list.Where((num, index) => index % 2 == 0);

提及您可以使用仅在方法语法中投影索引的这些重载可能也很重要。 LINQ查询语法不支持它。