2013-02-15 5 views
0

Просто интересно, какой подход быстрее и лучше использовать, или которые вы предпочитаетеLinq Любой() против Еогеасп

bool userHavePermission = user.Permissions.Any(x => x.UpperName == "ADMINISTRATOR"); 

или

foreach (Permission p in _Permissions) 
{ 
    if (p.UpperName == name.ToUpper()) 
     return true; 
} 
return false; 

Благодаря

+1

эффективно, это тот же код; 'Any' выполняет итерацию над' IEnumerable', применяя предикат, возвращая true (и останавливая итерацию) в первом совпадении. Тем не менее, я бы выбрал «Any», так как очень ясно, что пытается сделать код. – JerKimball

+3

Вы пытались сравнить полученный код IL? Или, если отличается, получившийся в результате код? –

+0

Вопрос полностью субъективен и не является конструктивным, что делает его непригодным для SO. – Servy

ответ

4

Это почти тот же код, то только с тем, что со вторым фрагментом кода вы получите NullReferenceException во время выполнения, если переменная name равна null, потому что вы будете звонить .ToUpper() метод на нулевом экземпляре. Первый выглядит короче, безопаснее и читабельнее, это то, что я буду использовать. И для обеспечения того, чтобы не было никаких НЭО:

return user 
    .Permissions 
    .Any(x => string.Equals(x.UpperName, name, StringComparison.OrdinalIgnoreCase)); 
0

Использование Any - лучший подход, поскольку это одна строка. Он читает легче и занимает меньше места.

Кроме того, неясно, что такое объект Permissions, но если это объект somekind, представляющий таблицу базы данных, то Any определенно лучше, поскольку вы возвращаете результат запроса только там, где foreach собирается разрешить весь список разрешений до начала итерации.