lambda表达式如何在给定的代码片段中工作

时间:2016-08-04 12:01:19

标签: c# lambda

我的项目中有以下代码段。我是lambda表达式的新手。我对它有一些想法 开始使用它。但我不明白下面的代码是如何工作的。特别地,

NotifyIntrenal( notification, callback, changedTypes => ..

现在,changedTypes是方法NotifyIntrenal的参数之一。我们使用一种不合理的方法得出它的价值。

如果我看到代码,因为我没有为changedTypes分配任何值,所以根据我的理解,代码if (changedTypes == null)应该 永远是true。但是当我调试时情况并非如此。

有人可以解释一下这是如何运作的吗?

private void Notify( Notification notification )
{
    var nameDto = GetNameDto();
    foreach (var subscription in _subscriptionsDictionary)
    {
        var callback = subscription.Key;
        var subscribedTypes = subscription.Value;
        NotifyIntrenal( notification, callback, changedTypes =>
            {
                if (changedTypes == null)
                    return subscribedTypes;

                if (!changedTypes.Any())
                    return subscribedTypes;

                return changedTypes.Intersect(subscribedTypes);
             }, nameDto);
    }
}

谢谢&此致

2 个答案:

答案 0 :(得分:3)

changedTypes NotifyInternal的参数。它是匿名方法的参数 这个整个方法是NotifyInternal的参数

此时不执行lambda中的代码。它只会在NotifyInternal 中的某些行调用时执行。因此,NotifyInternal中的代码行必须执行匿名方法:

void NotifyInternal(Notification notification, Callback callback, Func<IEnumerable<Type>, IEnumerable<Type>> function, string nameDto)
{
    // ... some code

    // execute the lambda
    var result = function(mychangedtypesvariable);

    // ... more code
}

只有这样才能使用pass参数(在该示例中为mychangedtypesvariable)执行lambda中的代码。因此,如果这将为null,则无法从您看到的代码段中做出决定。

答案 1 :(得分:0)

changedTypes只是匿名方法的一个参数,而不是NotifyIntrenal。然而,后者调用匿名方法并适当填充参数(如果需要)。在您的情况下,匿名方法需要IEnumerable<MyType>并返回IEnumerable<MyType>

NotifyIntrenal(string arg1, string arg2, Func<IEnumerable<MyType>, IEnumerable<MyType>> func) {
    // do something

    var list = new List<MyType> { ...}
    // execute the delegate with the list
    IEnumerable<MyType> result = func(list);
}

实际上changedTypes是由 NotifyIntrenal提供的,而不是提供给它。如何在方法中创建该参数取决于您。