如何在foreach循环中运行一段代码片段

时间:2014-05-13 13:16:38

标签: c# arrays list foreach

假设我有一个列表,并且如果程序进入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();

你有更好的主意吗?

3 个答案:

答案 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语句枚举集合的元素,   为集合的每个元素执行嵌入语句。

因此,如果您希望为集合的每个元素执行某些操作,请将其放入嵌入语句中。如果你想要只执行一次,那么将它放在一个语句中,该语句为集合的每个元素执行,并试图避免为每个元素运行它 - 而不是非常好的主意。

你的最后一个样本对我来说完全没问题。只需去掉牙箍(虽然味道很重要)。