Linq表达式用于过滤FormCollection

8

我有一个FormCollection,我只想遍历不包含字符串“pricing”的键。

所以我尝试了以下方法...

foreach (var key in collection.AllKeys.Where(k => !k.Contains("Pricing"))){ ... }

问题在于返回值不是经过筛选的列表,而是布尔值...我需要经过筛选的字符串列表...

AllKeys返回一个字符串数组,因此在某种意义上,我只是想在这里过滤一个字符串数组...

我缺少什么呢...

非常感谢!


我觉得那看起来很好 - 不确定为什么会得到一堆布尔值。你尝试检查变量以查看它是什么类型了吗? - JustLoren
@JustLoren,foreach循环中声明的key变量是string类型的,因为Where扩展方法返回的是IEnumerable<string>,所以你指出这段代码无法得到布尔值是正确的。 - Darin Dimitrov
@gmcalab,string.Contains(string) 方法是区分大小写的。这可能是问题所在吗? - Darin Dimitrov
使用上述语法,“var”是一个布尔值。因此,它不会返回一个“IEnumerable<string>”,而“key”现在也不是字符串了,而是一个布尔值。如果您认为它应该使用上述语法返回字符串,那么VS2008就在这里执行了一些奇怪的操作。我在下面发布了解决方案。 - Gabe
2个回答

12

下面是答案...

foreach (var key in collection.AllKeys.Where(k => !k.Contains("Pricing")).ToArray<string>()){ ... }

-1
你确定你正在使用的是 Where 而不是 Select 吗?
使用 Where 将返回一个 IEnumerable<string>,这正是你所期望的。
而使用 Select 将返回一个 IEnumerable<bool>,这正是你所说的实际发生的事情。

我尝试了这个...string[] list = collection.Where(o => !o.Contains("Pricing"));但它无法编译,显示返回类型是bool... 我已经找到了答案并发布了它。 其中不返回IEnumerable<string>是什么? - Gabe
1
如果“collection”是“FormCollection”/“NameValueCollection”,那么您的“Where”子句肯定会返回“IEnumerable<string>”。 - LukeH
+1 @Luke,indeed会返回IEnumerable<string>。foreach (string key in Request.Form.AllKeys.Where(k => !k.Contains("Pricing"))){}IEnumerable<string> collection = Request.Form.AllKeys.Where(k => !k.Contains("Pricing"));两者都可以完美编译。 - Mark Coleman
@Luke:嗯,我也以为它会返回一个IEnumerable<string>,但实际上并不是这样。使用以上语法编译时会报错,说它返回一个bool类型。只有当我添加.ToArray<string>()后才能正常工作。 - Gabe
但是您只能在 IEnumerable<string> 上调用 ToArray<string>Where 调用的返回类型必须为 IEnumerable<string>,否则您的 ToArray 调用也无法编译。 - LukeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接