【问题标题】:Linq expression to filter formcollection用于过滤表单集合的 Linq 表达式
【发布时间】:2009-11-06 16:40:55
【问题描述】:

我有一个 FormCollection,我只想遍历不包含字符串定价的键。

所以我尝试的是这个......

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

问题是返回的不是过滤列表,它返回的布尔值...其中需要过滤的字符串列表...

AllKeys 返回一个字符串[],所以从某种意义上说,我只是想在这里过滤一个字符串[]...

我在这里错过了什么......

非常感谢!

【问题讨论】:

  • 这对我来说很好——不知道为什么你会得到一堆布尔值。您是否尝试过检查 var 以查看它是什么类型?
  • @JustLoren,foreach 循环中声明的key 变量是string 类型,因为Where 扩展方法返回IEnumerable<string>,所以你指出它是正确的无法从此代码中获取布尔值。
  • @gmcalab, string.Contains(string) 方法区分大小写。这可能是问题吗?
  • 使用上面的语法 var 是一个布尔值。因此,它不返回 IEnumerable 并且 key 现在不是字符串,它是布尔值。如果你说它应该返回具有上述语法的字符串,那么 VS2008 在这里执行了一些古怪的魔法。我在下面发布了解决方案。

标签: c# asp.net linq


【解决方案1】:

这就是答案...

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

【讨论】:

    【解决方案2】:

    您确定您使用的是Where 而不是Select

    使用Where 将返回一个IEnumerable&lt;string&gt;,这是您所期望的。

    使用Select 将返回IEnumerable&lt;bool&gt;,这就是您所说的实际发生的情况。

    【讨论】:

    • 哪里不返回 IEnumerable 我试过这个... string[] list = collection.Where(o => !o.Contains("Pricing"));而且它不会编译说返回类型是布尔值....我已经找到了答案并发布了它。
    • @gmcalab: 如果collectionFormCollection/NameValueCollection 那么你的Where 子句肯定会返回IEnumerable&lt;string&gt;
    • +1 @Luke, Where 确实会返回 IEnumerable foreach (Request.Form.AllKeys.Where(k => !k.Contains("Pricing")) 中的字符串键){} IEnumerable 集合 = Request.Form.AllKeys.Where(k => !k.Contains("Pricing"));两者都能完美编译。
    • @Luke:好吧,我认为它也会返回一个 IEnumerable ,但事实并非如此。它不会用上面所说的语法编译,它说它返回一个布尔值。它仅在我添加 .ToArray() 时才有效
    • @gmcalab:但您只能在IEnumerable&lt;string&gt; 上致电ToArray&lt;string&gt;Where 调用的返回类型必须IEnumerable&lt;string&gt;,否则您的ToArray 调用也不会编译。
    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多