Коллега попросил, чтобы я записал остроту для замены следующего метода:
public static bool IsResourceAvailableToUser(IEnumerable<string> resourceRoles, IEnumerable<string> userRoles)
{
foreach (var userRole in userRoles)
foreach (var resourceRole in resourceRoles)
if (resourceRole == userRole)
return true;
return false;
}
Resharper и я придумали это:
public static bool IsResourceAvailableToUser(IEnumerable<string> resourceRoles, IEnumerable<string> userRoles)
{
return userRoles.Where(resourceRoles.Contains).Count() > 0;
}
Существует ли лучший путь?
Учитывая LINQ, да:
return userRoles.Intersect(resourceRoles).Any();
Обратите внимание, что помимо использования Intersect
, чтобы превратить его в O (m) + O (n) вместо O (m * n), используя Любое
более эффективно, чем использование Count ()> 0
- вы узнаете ответ, как только найдете первое совпадение.