假设我有一个列表,并且如果程序进入foreach,则只想运行一次方法。但重要的是,最初我不知道循环是否为空。 在foreach循环中只运行一次代码片段的最佳做法是什么?
List<int> dummy = new List<int> {1, 2, 3, 4, 5};
int sum = 0;
foreach (int i in dummy)
{
sum += i;
DoJob(); //this method must run only once
}
我试过了,但看起来不太好看
List<int> dummy = new List<int> {1, 2, 3, 4, 5};
int sum = 0;
foreach (int i in dummy)
sum += i;
if (dummy.Count>0)
DoJob();
你有更好的主意吗?
答案 0 :(得分:3)
它必须在循环内吗?根据您发布的内容,它似乎并不存在。
List<int> dummy = new List<int> {1, 2, 3, 4, 5};
if(dummy.Any())
DoJob();
int sum = 0;
foreach (int i in dummy)
sum += i;
此外,我假设该代码段只是一个示例,而不是您的实际代码...如果它是您的实际代码,您可以使用Sum
(例如,int sum = dummy.Sum();
)代替一个foreach
循环。
我还假设您的实际代码使用实际的List<T>
或其他一些具体的集合类型。如果它使用IEnumerable
,那么上面的代码将遍历可枚举的两次,这是不推荐的。如果枚举实际上代表数据库查询,那么您将对数据库进行两次命中。因此,如果是这种情况,请先通过调用.ToList
来实现可枚举。
答案 1 :(得分:1)
如果使用linq
if (dummy != null && dummy.Any())
{
DoJob();
}
如果不使用linq
if (dummy != null && dummy.Count > 0)
{
DoJob();
}
答案 2 :(得分:1)
C#规范明确说明了 foreach 语句(8.8.4 The foreach statement)的用途:
foreach (type identifier in expression) embedded-statement
foreach语句枚举集合的元素, 为集合的每个元素执行嵌入语句。
因此,如果您希望为集合的每个元素执行某些操作,请将其放入嵌入语句中。如果你想要只执行一次,那么将它放在一个语句中,该语句为集合的每个元素执行,并试图避免为每个元素运行它 - 而不是非常好的主意。
你的最后一个样本对我来说完全没问题。只需去掉牙箍(虽然味道很重要)。