And*_*ndy 12 .net c# linq where
我明白为什么不允许这样做:
foreach (Thing t in myCollection) {
if (shouldDelete(t) {
myCollection.Delete(t);
}
}
Run Code Online (Sandbox Code Playgroud)
但是怎么样?
foreach (Thing t in myCollection.Where(o=>shouldDelete(o)) {
myCollection.Delete(t);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会失败."Where()"方法显然不会返回原始集合,因此当我尝试从中删除某些内容时,我不会枚举原始集合.
Eri*_*ert 26
我不明白为什么会失败.
我假设你的问题是"为什么会失败?" (你忘了在你的问题中实际问一个问题.)
"Where()"方法显然不会返回原始集合
正确."Where"返回一个IEnumerable<T>代表集合的集合,其上放置了一个过滤器.
因此,当我尝试从中删除某些内容时,我不会对原始集合进行枚举.
不正确.您正在枚举原始集合.您正在枚举原始集合,并在其上放置一个过滤器.
当您调用"Where"时,它不会急切地评估过滤器并生成原始集合的全新副本,并应用过滤器.相反,它会为您提供一个枚举原始集合的对象,但会跳过与过滤器不匹配的项目.
当你在一家商店并且说"向我展示一切"时,向你展示一切的人向你展示了一切.当你说"现在只给我看一公斤1到5美元的苹果"时,你并没有建造一个只有苹果的全新商店.你正在寻找与以前完全相同的东西集合,只需要一个过滤器就可以了.
Lik*_*urg 13
尝试使用此代码
myCollection.RemoveAll(x => x.shouldDelete(x));
Run Code Online (Sandbox Code Playgroud)
你可以做:
myCollection.RemoveAll(shouldDelete);
Run Code Online (Sandbox Code Playgroud)
第二个语句返回IEnumerable<>列表中的操作.这个应该没关系:
foreach (Thing t in myCollection.Where(o=>shouldDelete(o).ToList()) {
myCollection.Delete(t);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7070 次 |
| 最近记录: |