IEnumerable的多个枚举

Chr*_*oph 6 linq ienumerable

我知道IEnumerable已在这里多次讨论,但我找不到我的具体问题的答案,所以我把它作为一个新问题提出来.

考虑以下代码:

    static void Main(string[] args)
    {

        List<string> testList = new List<string> {"Test", "Test1", "Test1"};
        IEnumerable<string> filtered = testList.Where(x => x == "Test1");

        DoSomeWork(filtered);
        DoSomeMoreWork(filtered);
    }

    public static void DoSomeWork(IEnumerable<string> items)
    {
        foreach (var item in items)
        {
            Console.WriteLine("do some work");
        }
    }

    public static void DoSomeMoreWork(IEnumerable<string> items)
    {
        foreach (var item in items)
        {
            Console.WriteLine("do some more work");
        }
    }
Run Code Online (Sandbox Code Playgroud)

我是对的,这不仅导致"过滤"中的两个项目迭代两次,而且实际上是"testList"中的项目?因此,考虑到"testList"是一个包含10000个项目的大列表,"过滤"将其减少到10个项目,将"过滤"列表更加聪明(也就是使用var并在最后添加ToList())

编辑: 这是我在这里问过的最令人尴尬的问题.我知道迭代IQueryable是不好的,因为这会导致从DB中获取两次数据.但是我在内存列表中并不完全确定.如果可以,我会删除这个问题;-)

Wou*_*ort 7

大名单将重复两次.要检查这是否真的发生,请将您的查询更改为:

List<string> testList = new List<string> { "Test", "Test1", "Test1" };
IEnumerable<string> filtered = from t in testList
                               where t == "Test1"
                               select t;
Run Code Online (Sandbox Code Playgroud)

如果然后在'where t =="Test1"部分设置断点,您将看到调试器在两次迭代中都会遇到此行.


Pra*_*ana 0

List 最终继承自 IEnumrable 检查这一点

public class List<T> : IList<T>, ICollection<T>, 
    IEnumerable<T>, IList, ICollection, IEnumerable
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下构造函数创建 IEnurable 列表:

public List(
    IEnumerable<T> collection
)
Run Code Online (Sandbox Code Playgroud)

编辑

派生的过滤列表通过这两种方法迭代两次,但在末尾附加 .ToList() 方法。

IEnumerable<string> filtered = testList.Where(x => x == "Test1").ToList();
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/fkbw11z0.aspx