【问题标题】:Adding a parameter to a FindAll for a Generic List in C#在 C# 中为通用列表的 FindAll 添加参数
【发布时间】:2009-04-08 18:49:33
【问题描述】:

我有一个要按整数参数过滤的对象列表

List<testObject> objectList = new List<testObject>();

// populate objectList with testObjects

objectList.FindAll(GroupLevel0);

private static bool GroupLevel0(testObject item)
{ return item._groupLevel == 0; }

private class testObject
{
     public string _FieldSQL = null;
     public int _groupLevel;
}

我要做的是让 GroupLevel0 接受一个整数作为参数,而不是硬编码为 0。我在 .NET 2.0 中工作,所以 lambda 表达式是不行的。甚至可以将参数传递给谓词吗?

谢谢,

【问题讨论】:

    标签: c# generics predicate findall


    【解决方案1】:

    如果您坚持使用 C# 2.0,请使用匿名方法 - 只是稍微笨拙的 lambda 表达式(忽略表达式树):

    List<testObject> objectList = new List<testObject>();
    int desiredGroupLevel = 10;
    
    objectList.FindAll(delegate (testObject item)
    {
        return item._groupLevel == desiredGroupLevel;
    });
    

    或者您仍然可以使用方法调用开始:

    List<testObject> objectList = new List<testObject>();
    int desiredGroupLevel = 10;
    
    objectList.FindAll(CheckGroupLevel(desiredGroupLevel));
    
    ...
    
    public Predicate<testItem> CheckGroupLevel(int level)
    {
        return delegate (testItem item)
        {
            return item._groupLevel == level;
        };
    }
    

    但是,如果您使用 Visual Studio 2008 但目标 .NET 2.0,您仍然可以使用 lambda 表达式。这只是一个不需要框架支持的编译器技巧(同样,忽略表达式树)。

    【讨论】:

    • @Jon 不应该是objectList=objectList.FindAll(delegate (testObject item) ??
    【解决方案2】:
      int groupLevel = 0;
    
      objectList.FindAll(
           delegate(testObject item) 
           { 
              return item._groupLevel == groupLevel; 
           });
    

    这是一个匿名委托,它关闭了其父级的词法范围,因此它可以看到“groupLevel”。

    适用于 C# 2.0 及更高版本。如果您将来迁移到 .NET 3.5,我建议您使用 lambda。

    【讨论】:

      【解决方案3】:
      List<testObject> objectList = new List<testObject>();
      
      // populate objectList with testObjects
      
      objectList.FindAll(delegate(testObject o){ return GroupLevel(o, 0);} );
      
      private static bool GroupLevel(testObject item, int groupLevel)
      { return item._groupLevel == groupLevel; }
      

      此外,如果您使用 VS 2008,则在编译到 2.0 时仍然可以使用 lambda。它使用 3.5 编译器和 2.0 目标,我们已经使用了几个月。

      【讨论】:

      • 你无缘无故的封装了一个委托,把委托代码放在匿名委托中就好了。
      • 我刚刚编辑了他的代码以用作示例。这绝不是最优雅的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2021-02-25
      • 2018-10-21
      • 1970-01-01
      • 1970-01-01
      • 2018-07-08
      相关资源
      最近更新 更多