用linq删除foreach里面的地方

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)


Scr*_*og1 9

你可以做:

myCollection.RemoveAll(shouldDelete);
Run Code Online (Sandbox Code Playgroud)

  • ...如果`myCollection`的类型有一个RemoveAll方法!`List <T>`有,但许多集合类型没有. (2认同)

Mat*_*ten 6

第二个语句返回IEnumerable<>列表中的操作.这个应该没关系:

foreach (Thing t in myCollection.Where(o=>shouldDelete(o).ToList()) {
   myCollection.Delete(t);
}
Run Code Online (Sandbox Code Playgroud)