Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何内联声明谓词委托?_C#_Delegates - Fatal编程技术网

C# 如何内联声明谓词委托?

C# 如何内联声明谓词委托?,c#,delegates,C#,Delegates,所以我有一个对象,它有一些字段,实际上并不重要。 我有这些对象的通用列表 List<MyObject> myObjects = new List<MyObject>(); myObjects.Add(myObject1); myObjects.Add(myObject2); myObjects.Add(myObject3); List myObjects=new List(); myObjects.Add(myObject1); myObjects.Add(myObje

所以我有一个对象,它有一些字段,实际上并不重要。 我有这些对象的通用列表

List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
List myObjects=new List();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);
因此,我想根据一些条件从列表中删除对象。 例如,
myObject.X>=10。
我想使用的
RemoveAll(谓词匹配)
方法来实现这一点


我知道我可以定义一个可以传递到RemoveAll的委托,但我想知道如何用匿名委托内联定义此委托,而不是创建一组只在一个位置使用的委托函数。

有两个选项,显式委托或伪装为lamba构造的委托:

显式委托

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });
兰姆达

myObjects.RemoveAll(m => m.X >= 10);

就性能而言,两者都是平等的。事实上,两种语言构造在编译时生成相同的IL。这是因为C#3.0基本上是C#2.0的一个扩展,因此它编译为C#2.0结构

lambda C#3.0方式:

匿名委托C#2.0方式:

对于VB的人来说,VB 9.0 lambda方式:

myObjects.RemoveAll(Function(m) m.x >= 10)
不幸的是,VB不支持匿名委托

  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

谓词匹配=委托(fooo){returno.X>=10;});
//or谓词匹配=o=>o.X>=10;
移除所有(匹配项);

谓词是接受参数并返回布尔值的委托

我们可以通过以下方式做同样的事情

1) 使用内嵌Lambda表达式

RemoveAll(p=> p.x > 2);
RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})
public delegate bool IsInValidEmployee (Employee emp);

IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
2) 使用匿名函数

RemoveAll(p=> p.x > 2);
RemoveAll(delegate(myObject obj){

  return obj.x >=10;
})
public delegate bool IsInValidEmployee (Employee emp);

IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid);
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject);
3) 使用谓词委托

Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid);
RemoveAll(matches);

Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; });
RemoveAll(matches);
//实际功能

public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}

VB有lambdas时为什么需要匿名委托?是的,下一个版本将有多行lambda和不返回值的lambda(
Sub
s)。因为您刚才提到的原因-多行语句和不返回值的函数。很高兴知道它将出现在下一个版本中,但C#从2005年就开始使用它了。
public static bool IsEmployeeInValid(Employee emp)
{
    if (emp.Id > 0 )
        return true;
    else
        return false;
}