У меня есть фрагмент кода для некоторой логики проверки, которая в обобщенном виде выглядит следующим образом:
private bool AllItemsAreSatisfactoryV1(IEnumerable<Source> collection)
{
foreach(var foo in collection)
{
Target target = SomeFancyLookup(foo);
if (!target.Satisfactory)
{
return false;
}
}
return true;
}
Это работает, довольно легко понимает, и имеет раннюю оптимизацию. Однако он довольно многословен. Основная цель этого вопроса - то, что считается удобочитаемым и хорошим стилем. Меня также интересует производительность; я твердо верю, что преждевременное {оптимизация, пессимизация} является корнем всего зла , и постарайтесь избегать микрооптимизации, а также создания узких мест.
Я новичок в LINQ, поэтому хотел бы получить несколько комментариев по две альтернативные версии, которые я придумал, а также любые другие предложения относительно удобочитаемости.
private bool AllItemsAreSatisfactoryV2(IEnumerable<Source> collection)
{
return null ==
(from foo in collection
where !(SomeFancyLookup(foo).Satisfactory)
select foo).First();
}
private bool AllItemsAreSatisfactoryV3(IEnumerable<Source> collection)
{
return !collection.Any(foo => !SomeFancyLookup(foo).Satisfactory);
}
Я не верю, что V2 предлагает намного больше, чем V1 с точки зрения r проходимость, даже если короче. Я считаю V3 ясным и кратким, но мне не очень нравится метод Method ().Собственность
часть; конечно, я мог бы превратить лямбду в полноценного делегата, но тогда он теряет однострочную элегантность.
Я бы хотел прокомментировать следующее:
Заранее спасибо :)