如何使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>

的作用几乎完全相同