以下代码是授权的一部分。我试图精神成像它实际上做了什么,但不能以某种方式。
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)));
答案 0 :(得分:15)
当然 - 如果给出一对(x, y)
,x
包含y
包含该值的任何值。
在我看来它真的在说“x
和y
之间是否有任何交集。”
所以另一种选择可能是:
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();
}
基本上,i
或j
中的k
是任何元素。这假定您的x
和y
参数是各种各样的集合。
交叉点是一个有效的替代选择:
bool iIntersectsJ = i.Intersect(j).Any(); // true
bool iIntersectsK = i.Intersect(k).Any(); // false