Может ли кто-нибудь объяснить мне это лямбда-выражение? Это здорово, что я схожу с ума - PullRequest
6 голосов
/ 01 сентября 2011

Код ниже является частью авторизации. Я пытаюсь мысленно представить, что он на самом деле делает, но не может как-то.

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

Может ли кто-нибудь объяснить мне это лямбда-выражение?

Спасибо!

Edit:

IsAuthorized является типом делегата. Предыдущий программист, который, кажется, кодирует это, хочет сохранить это в секрете, поместив делегат в конец файла cs.

Фактический код:

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

Ответы [ 2 ]

15 голосов
/ 01 сентября 2011

Конечно - это говорит, что при наличии пары (x, y), содержит ли x какие-либо значения, такие, что y содержит это значение.

Мне кажется, что на самом деле говорится "есть ли пересечение между x и y ".

Таким образом, альтернативой может быть:

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

Возможно, что это не сработает, в зависимости от типа IsAuthorized, ноЯ ожидаю, что это будет правильно.

3 голосов
/ 01 сентября 2011

Чтобы объяснить объяснение Джона, вот (надеюсь) эквивалентный пример с выводами:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...