如何使IEnumerable new collection和return呢?
How to make new IEnumerable collection and return it?
我需要将一个 IEnumerable
和一个委托传递给我的方法,然后对其进行过滤,然后 return 一个 IEnumerable
collection 以及通过过滤的数字。
Func<int, bool> filter = x => x % 3 == 0;
public static IEnumerable<int> Filter(IEnumerable<int> numbers, Func<int, bool> filter)
{
foreach (int number in numbers)
{
if (filter.Invoke(number))
{
// add number to collection
}
}
// return collection
}
我试过像这样创建一个新的 collection:
IEnumerable<int> result = new IEnumerable<int>();
但这是不可能的,因为 IEnumerable
是一个抽象 class。
我应该如何创建 return 这个 collection?我知道有很多简单的方法可以做到这一点,但找不到。
正如@somebody 指出的那样,正确的方法是使用 yield return
:
public static IEnumerable<int> Filter(IEnumerable<int> numbers, Func<int, bool> filter) {
foreach (int number in numbers) {
if (filter.Invoke(number)) {
yield return number;
}
}
}
当您返回的集合(您返回的 IEnumerable<int>
)被枚举(通过 foreach
或调用 ToList
之类的东西)时,您的代码将首先被调用物品。当您到达 yield return
时,将返回第一个数字。当迭代发生第二遍(和后续遍)时,代码将继续在 yield return
.
之后的行上执行
就其价值而言,您的代码与 LINQ 的 Where
扩展方法对 IEnumerable<T>
的作用几乎完全相同
我需要将一个 IEnumerable
和一个委托传递给我的方法,然后对其进行过滤,然后 return 一个 IEnumerable
collection 以及通过过滤的数字。
Func<int, bool> filter = x => x % 3 == 0;
public static IEnumerable<int> Filter(IEnumerable<int> numbers, Func<int, bool> filter)
{
foreach (int number in numbers)
{
if (filter.Invoke(number))
{
// add number to collection
}
}
// return collection
}
我试过像这样创建一个新的 collection:
IEnumerable<int> result = new IEnumerable<int>();
但这是不可能的,因为 IEnumerable
是一个抽象 class。
我应该如何创建 return 这个 collection?我知道有很多简单的方法可以做到这一点,但找不到。
正如@somebody 指出的那样,正确的方法是使用 yield return
:
public static IEnumerable<int> Filter(IEnumerable<int> numbers, Func<int, bool> filter) {
foreach (int number in numbers) {
if (filter.Invoke(number)) {
yield return number;
}
}
}
当您返回的集合(您返回的 IEnumerable<int>
)被枚举(通过 foreach
或调用 ToList
之类的东西)时,您的代码将首先被调用物品。当您到达 yield return
时,将返回第一个数字。当迭代发生第二遍(和后续遍)时,代码将继续在 yield return
.
就其价值而言,您的代码与 LINQ 的 Where
扩展方法对 IEnumerable<T>