这个东西的意思是什么:
IEnumerable<int> query = from num in list
where num < 3
select num;
这是IEnumerable<T>的对象吗?
任何人都可以描述一下吗?
这个东西的意思是什么:
IEnumerable<int> query = from num in list
where num < 3
select num;
这是IEnumerable<T>的对象吗?
任何人都可以描述一下吗?
你知道正常的方法语法,对吧?之类的东西list.Add(10)
。Microsoft 的一些聪明人指出,许多集合和列表存在相似之处。人们可能喜欢做一些事情,比如选择某些值并对应该适用于所有集合的值求和,而不需要每个集合都为其提供方法。
因此,他们引入了扩展方法,即只定义一次但可以应用于特定类型的所有对象(例如集合)的方法。例子是list.Where
和list.Sum
。要使用扩展方法,您必须添加定义它们的命名空间。扩展方法采用 lambda 表达式,该Where
表达式在集合的每个元素上执行。
假设您有一些整数列表:
List<int> list = new List<int>();
list.Add(-1);
list.Add(0);
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
然后,我以前必须编写以下代码来仅获取小于三的整数:
List<int> query = new List<int>();
foreach(var nr in list)
{
if (nr < 3)
query.Add(nr);
}
现在,使用扩展方法,我可以这样写:
IEnumerable<int> query = list.Where(nr => nr < 3);
枚举时,query
只会返回list
小于三的整数。这些扩展方法是 LINQ(语言集成查询)的一部分。
但是,为了使 LINQ 更易于使用,他们设计了一种新语法。使用这种新语法,LINQ 更易于阅读和编写。
IEnumerable<int> query = from nr in list
where nr < 3
select nr;
编译器采用新语法并将其转换为前面提到的包含该Where
方法的代码。你看,它只是让处理集合更容易的语法糖。
该IEnumerable<int>
接口是任何可以枚举的对象的通用接口。最简单的枚举形式是foreach
对对象进行操作,它会一一返回它包含的所有整数。因此,LINQ 查询返回一些 object,但您不知道确切的类型。但是你知道它可以被枚举,这使得它非常有用。
这是一个 linq 等价于 say
IEnumerable<int> GetLessThanThree(IEnumerable<int> list)
{
foreach(int num in list)
{
if (num < 3)
{
yield return num
}
}
}
或者如果你还没有达到收益
IEnumerable<int> GetLessThanThree(IEnumerable<int> list)
{
List<int> result = new List<int>();
foreach(int num in list)
{
if (num < 3)
{
result.Add(num);
}
}
return result;
}