C# LINQ 查询与投影

定义数据源
string[] fruits = { "apple", "banana", "mango", "orange", "grape" };
创建查询

查询变量本身只存储查询命令。 查询的实际执行将推迟到在 foreach 语句中循环访问查询变量之后进行。有两种方式可创建查询变量,示例如下:

// 方式一:查询语句语法
var q1 = from f in fruits where f.Length < 6 select f;
// 方式二:方法语法
var q2 = fruits.Where(f => f.Length < 6); // 可省略 select
投影

Select 子句的作用是选择查询结果或投影。Select 子句生成查询结果并指定每个返回的元素的“形状”或类型。 例如,可以指定结果包含的是整个对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。当 Select 子句生成除源元素副本以外的内容时,该操作称为投影 。使用投影转换数据是 LINQ 查询表达式的一种强大功能。

 // 将查询结果投影到匿名类
var q3 = fruits.Where(f => f.Length < 6).Select((f, i) => new { i, f });// 投影到元祖
var q4 = fruits.Where(f => f.Length < 6).Select((f, i) => (Id: i, Name: f));
执行查询
// 执行查询 q1
foreach (var q in q1)
{
	Debug.Log(q);
}

// 执行查询 q4
foreach (var q in q4)
{
	Debug.Log($"{q.Id} : {q.Name}");
}
匿名类和元组

上面的 q3,q4 用到了匿名类和元组进行投影,匿名类与元组是比 class 和 struct 类型更为简单灵活的数据容器。

// 匿名类的定义
// 方式一
var class1 = new { age = 20, name = "mango" };
// 方式二
int age = 21;
string name = "passionfruit";
var class2 = new { age, name };

// 元组的定义
// 方式一
var unnamed = ("one", "two"); // 未命名元组,使用 Item1,Item2 访问
// 方式二
var named = (first: "one", second: "two"); // 命名元组,使用名称访问

元组的一些其他用法:

// 赋值
public class Employee
{
    public string name;
    public int age;
	// 构造函数中,使用元组赋值	
    public Employee(string name, int age) => (this.name, this.age) = (name, age);
}

// 元组类型支持 == 和 != 运算符
{
	Employee e = new Employee("Joe", 20);
	// 使用元组进行判断
	if ((e.name, e.age) == ("Joe", 20))
	{
		Debug.Log("equal");
	}
}

你可能感兴趣的:(Unity)