有人能向我解释这个lambda表达吗?这让我发疯了

时间:2011-09-01 15:30:35

标签: c# .net lambda

以下代码是授权的一部分。我试图精神成像它实际上做了什么,但不能以某种方式。

IsAuthorized = ((x, y) => x.Any(z => y.Contains(z)));

有人能向我解释这个lambda表达吗?

谢谢!

修改

IsAuthorized是委托类型。编写此代码的前一个程序员似乎希望通过将委托放在cs文件的末尾来保密。

实际代码是:

public delegate bool IsAuthorized(IEnumerable<Int32> required, IEnumerable<Int32> has);
IsAuthorized = ((x, y) => x.Any(z => y.Contains(z)));

2 个答案:

答案 0 :(得分:15)

当然 - 如果给出一对(x, y)x包含y包含该值的任何值。

在我看来它真的在说“xy之间是否有任何交集。”

所以另一种选择可能是:

IsAuthorized = (x, y) => x.Intersect(y).Any();

根据IsAuthorized的类型,这可能不起作用,但我希望它是正确的。

答案 1 :(得分:3)

与Jon的解释一致,这里(希望是)具有输出的等效样本:

    static void Main(string[] args)
    {
        int[] i = new int[] { 1, 2, 3, 4, 5 };
        int[] j = new int[] { 5, 6, 7, 8, 9 };
        int[] k = new int[] { 0, 6, 7, 8, 9 };

        bool jContainsI = i.Any(iElement => j.Contains(iElement));
        bool kContainsI = i.Any(iElement => k.Contains(iElement));

        Console.WriteLine(jContainsI); // true
        Console.WriteLine(kContainsI); // false
        Console.Read();
    }

基本上,ij中的k是任何元素。这假定您的xy参数是各种各样的集合。

交叉点是一个有效的替代选择:

bool iIntersectsJ = i.Intersect(j).Any(); // true
bool iIntersectsK = i.Intersect(k).Any(); // false