我在这里两次迭代这个可枚举的吗?

Mik*_*oud 2 c# algorithm optimization

考虑以下代码块:

using (FileStream fs = new FileStream(@"C:\bad_records.txt", 
                                      FileMode.Create, 
                                      FileAccess.Write))
{
    var badEnumerable = _cache.Where(kvp => !kvp.Value.Item1);

    fs.WriteLine(string.Format("BAD  RECORDS ({0})", badEnumerable.Count()));
    fs.WriteLine("==========");

    foreach (var item in badEnumerable)
    {
        fs.WriteLine(string.Format("{0}: {1}", item.Key, item.Value.Item2));
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里_cache定义如下:

static Dictionary<string, Tuple<bool, string, string>> _cache;
Run Code Online (Sandbox Code Playgroud)

我可以两次迭代这个可枚举的吗?曾经Count()和一次一起foreach

Ser*_*rvy 8

是的,你正在迭代可枚举两次.

测试这个的简单方法是使用辅助方法,例如:

private static int count = 0;
public static IEnumerable<T> CountIterations<T>(IEnumerable<T> sequence)
{
    count++;
    //or some other debug type logging
    Console.WriteLine("Iterated {0} times.", count);
    foreach(var item in sequence)
        yield return item;
}
Run Code Online (Sandbox Code Playgroud)