代码之家  ›  专栏  ›  技术社区  ›  Mike_G

何时执行此LINQ查询?

  •  4
  • Mike_G  · 技术社区  · 15 年前
    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();
        }
    }
    

    我知道LINQ在集合被迭代之前不会执行,但我只想确保即使查询被异步传递给另一个方法,它仍然保持为true。

    4 回复  |  直到 15 年前
        1
  •  18
  •   Jon Skeet    15 年前

    是的,查询执行仍然延迟。该查询只是对 IEnumerable<T> 这反过来又知道另一个 (与适当的代理一起进行筛选、分组等)。

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

        2
  •  3
  •   MattH    15 年前

        3
  •  2
  •   Sanu Uthaiah Bollera    11 年前

    下图显示了完整的查询操作。在LINQ中,查询的执行不同于查询本身,请参见下文。

    enter image description here

    资料来源: MSDN

        4
  •  1
  •   bytebender    15 年前

    ints.ToArray(); 在不同的线程中,这不重要。。。

    我站在正确的立场,它将执行在ForEach。。。