我知道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中获取两次数据.但是我在内存列表中并不完全确定.如果可以,我会删除这个问题;-)
大名单将重复两次.要检查这是否真的发生,请将您的查询更改为:
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"部分设置断点,您将看到调试器在两次迭代中都会遇到此行.
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
| 归档时间: |
|
| 查看次数: |
3296 次 |
| 最近记录: |