5

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

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 表达式是不行的。甚至可以将参数传递给谓词吗?

谢谢,

4

3 回答 3

7

如果您坚持使用 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 表达式。这只是一个不需要框架支持的编译器技巧(同样,忽略表达式树)。

于 2009-04-08T18:51:49.907 回答
1
  int groupLevel = 0;

  objectList.FindAll(
       delegate(testObject item) 
       { 
          return item._groupLevel == groupLevel; 
       });

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

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

于 2009-04-08T18:52:10.483 回答
0
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。它使用带有 2.0 目标的 3.5 编译器,我们已经使用了几个月。

于 2009-04-08T18:53:08.017 回答