gpt4 book ai didi

c# - LINQ 或 foreach - 风格/可读性和速度

转载 作者:太空狗 更新时间:2023-10-29 20:59:59 25 4
gpt4 key购买 nike

我有一段用于某些验证逻辑的代码,一般来说是这样的:

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 好多少,即使更短。我发现 V3 清晰简洁,但我不太喜欢 Method().Property 部分;当然,我可以将 lambda 变成一个完整的委托(delegate),但这样它就失去了单行代码的优雅。

我想评论的是:

  1. 风格 - 非常主观,但您觉得什么是可读的?
  2. 性能 - 这些都是绝对不能做的吗?据我了解,这三种方法都应该提早淘汰。
  3. 可调试性 - 有什么要考虑的吗?
  4. 备选方案 - 一切皆有可能。

提前致谢:)

最佳答案

我认为 All 会更清楚:

private bool AllItemsAreSatisfactoryV1(IEnumerable<Source> collection)
{
return collection.Select(f => SomeFancyLookup(f)).All(t => t.Satisfactory);
}

我认为在这里使用 linq 不太可能导致常规 foreach 循环出现性能问题,尽管如果确实如此,更改起来会很简单。

关于c# - LINQ 或 foreach - 风格/可读性和速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3663277/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com