在C#中为通用列表的FindAll添加参数

我有一个对象列表,我想用整数参数过滤

List objectList = new List(); // 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#2.0,请使用匿名方法 – 只是略微笨拙的lambda表达式(忽略表达式树):

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

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

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

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

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

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

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

 List objectList = new List(); // 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时仍可以使用lambdas。 它使用3.5编译器和2.0目标,我们已经使用了几个月。