我对这个选择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();
}
}
}
结果是
0 John Doe
1 Jacob Doe
答案 0 :(得分:5)
Enumerable.Select
有一个重载,用于投射序列中元素的当前索引。此外,Enumerable.Where
和Enumerable.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查询语法不支持它。