这个LINQ查询何时执行?

Mik*_*e_G 4 c# linq

public class TestClass
{
    public TestClass(int id, string name)
    {
        Name = name;
        Id = id;
    }
    public string Name
    { get; private set; }

    public int Id
    { get; private set; }

    public string Tag
    { get; set; }

    public DateTime Time
    { get; set; }
}

 private static void Main(string[] args)
    {
        List<TestClass> list = new List<TestClass>();

        for (int i = 0; i < 5; i++ )
        {
            TestClass t = new TestClass(i, Guid.NewGuid().ToString());
            t.Tag = i%2 == 0?"Hello":"World";
            list.Add(t);
        }

        var query = list
            .GroupBy(l=>l.Tag);

        Func<IEnumerable<IGrouping<string, TestClass>>, int[]> func = GetIds<string,TestClass>;

        func.BeginInvoke(query, null, null);

        Console.Read();
    }

    private static int[] GetIds<T, U>(IEnumerable<IGrouping<T, U>> query)
    {
        List<int> ints = new List<int>();

        foreach(var y in query)
            ints.Add(y.Count());

        return ints.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道LINQ不会执行,直到集合被迭代,但我只是想确保我可以假设它仍然成立,即使查询被传递给另一个方法async.

Jon*_*eet 16

是的,查询执行仍然是延期的.查询只是对实现的引用,而实现IEnumerable<T>又知道另一个实现IEnumerable<T>(以及用于过滤,分组等的适当委托).

请注意,如果您再次迭代它(在任何线程中)将再次执行查询.查询引用知道如何获取数据 - 它不知道数据本身.