为什么每次访问变量时都会调用一个LINQ查询?

29 浏览
0 Comments

为什么每次访问变量时都会调用一个LINQ查询?

这个问题已经有答案了:

yield关键字在C#中用于什么?

为什么下面的代码中会再次调用Square()?我认为values是被重新计算了,但是为什么?我们先前已经得到了values,为什么会再次调用它?为什么编译器会发出\"可能多次枚举\"的警告?

static IEnumerable Square(IEnumerable a)
{
    foreach(var r in a)
    {
        Console.WriteLine($"From Square {r * r}");
        yield return r * r;
    }
}
class Wrap
{
    private static int init = 0;
    public int Value
    {
        get { return ++init; }
    }
}
static void Main(string[] args)
{
    var w = new Wrap();
    var wraps = new Wrap[3];
    for(int i=0; i<wraps.Length; i++) { wraps[i] = w; } var values = wraps.Select(x => x.Value);
    var results = Square(values);
    int sum = 0;
    int count = 0;
    foreach(var r in results)
    {
        count++;
        sum += r;
    }
    Console.WriteLine("Count {0}", count);
    Console.WriteLine("Sum {0}", sum);
    Console.WriteLine("Count {0}", results.Count());
    Console.WriteLine("Sum {0}", results.Sum());
}

结果:

From Square 1
From Square 4
From Square 9
Count 3
Sum 14
From Square 16
From Square 25
From Square 36
Count 3
From Square 49
From Square 64
From Square 81
Sum 194

admin 更改状态以发布 2023年5月21日
0
0 Comments

Square(values)返回一个IEnumerable,每次访问时都进行迭代。

如果将结果转换为List(),则结果将被固定在List()中。

var results = Square(values).ToList();

使用.ToList()的结果

From Square 1
From Square 4
From Square 9
Count 3
Sum 14
Count 3
Sum 14

0