【问题标题】:Linq, collections, and a boolean functionLinq、集合和布尔函数
【发布时间】:2011-12-14 23:24:25
【问题描述】:

我想这样做

return array.Any(IsOdd);

但我有一个对象列表,而不是一个数组,其中 IsOdd 将 object.Number 属性作为其参数。

我试过了

return objectList.Select(x => x.Number).Any(IsOdd);

但收到此错误“'Select' 不是 'System.Collections.Generic.List(Of myObject)' 的成员。”

我的代码实际上是在 VB 中,我使用的是 vs 2010,但目标是 .net 2.0。

【问题讨论】:

    标签: linq visual-studio-2010 collections .net-2.0 boolean


    【解决方案1】:

    更新答案

    There is no official way 在 .NET 2.0 中使用 LINQ,但如果您只对 LINQ to Objects 感兴趣,LINQBridge 可以提供帮助。

    原答案

    首先,您可以简单地使用Any 的另一个重载并写入

    return objectList.Any(o => IsOdd(o.Number));
    

    其次,这听起来像是您在文件中忘记了using System.Linq——尽管在这种情况下,直接调用Any 也不起作用。

    【讨论】:

    • 现在看来他的目标是2.0
    • @AnthonyPegram:更新了答案,让它看起来不傻,谢谢。
    【解决方案2】:

    由于您的目标是 2.0,因此快速回答是 .NET 2.0 不支持 LINQ 或扩展方法

    如果您决定不想像@Jon 建议的那样使用 LINQBridge,您可以非常轻松地重新创建自己的 Any 方法,如下所示:

    public static class MyLINQBridge {
        public delegate TResult Func<T1, TResult>(T1 first);
        public static bool Any<T>(this IEnumerable<T> source, Func<T, bool> predicate) {
            foreach (var item in source) {
                if (predicate(item)) {
                    return true;
                }
            }
            return false;
        }
    
    }
    

    由于您使用的是 VS2010,编译器支持 lambda 方法和can support extension methods,因此您的最终代码如下所示:

    return objectList.Any(o => IsOdd(o.Number));
    

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多