2010-05-11 3 views
4

У меня есть 2 строковых массива, и я хотел бы вернуться, если любой из них существует в массиве _authRole. Как это делается?LINQ Если .Any подходит. Любой

string[] _userRoles = userdata.Split(','); 

string[] _authRoles = AuthRoles.Split(','); 


bool isAuthorized = _authRoles.Any(_userRoles ??); 

/M

ответ

7

Попробуйте это:

Boolean isAuthorized = 
    _userRoles.Any(user => _authRoles.Contains(user)); 
10

Если то, что вы хотите, чтобы определить, является ли _authRoles и _userRoles имеют по крайней мере один общий элемент, а затем использовать:

bool isAuthorized = _authRoles.Intersect(_userRoles).Any(); 

Вы также можете запросить результат Intersect любым другим способом, новления.

+0

+1. Раньше я не использовал «Любые» таким образом; это лучше, чем предлагаемое мной решение. –

+0

Спасибо. Это одна из тех вещей, которые сразу же очевидны ... после того, как они впервые перейдут в ваш ум. :-) – Jon

3

Предположим, что списки имеют размер N и M и что вероятный сценарий не соответствует. Решением Эндрю является O (NM) во времени и O (1) в дополнительной памяти. Решение Адама - O (N + M) во времени и памяти, но может быть написано более четко, как решение Джона.

Другое решение, которое в основном так же, как Адам и Джона будет присоединиться два списка:

var joined = from user in userRoles 
      join auth in authRoles 
      on user equals auth 
      select user; 
return joined.Any(); 

Это немного больший вес, чем это необходимо, но он читает хорошо. :-)

+0

Я не могу устоять, сказав, что если Эрик Липперт ответит не лучшим решением, которое вам определенно будет хорошо. :-) Приветствую Эрика, давним читателем вашего блога. – Jon

+0

Являются ли они определенно O (NM) и O (N + M), или LINQ оптимизирует его, как в случае с 'Any()' в конце решения Jon, он должен найти только один результат, прежде чем он сможет вернуться. – cjk

+0

@ck: обозначение Big-O как O (f (x)) задается как предел, когда x переходит в бесконечность. Таким образом, любое раннее изложение не имеет отношения к временной сложности (если вы не всегда рассматриваете наилучший вариант O (1)). –

Смежные вопросы