none
linq问题(vs2010和vs2012) RRS feed

  • 问题

  • 请问vs2010和vs2012中linq的使用有哪些区别(能不能重点说说延迟执行)

    please verify my account



    • 已编辑 lctk 2014年12月29日 0:10
    2014年12月28日 8:09

答案

  • 嗯! 差在編譯出來的Code不同!

    VS2013編譯出來如下,

    private static void Main(string[] args)
    {
        IEnumerable<char> source = "Not what you might expect";
        string str = "aeiou";
        for (int i = 0; i < str.Length; i++)
        {
            char vowel = str[i];
            source = Enumerable.Where<char>(source, delegate (char c) {
                return c != vowel;
            });
        }
        foreach (char ch in source)
        {
            Console.Write(ch);
        }
        Console.ReadLine();
    }


    VS2010編譯如下,

    private static void Main(string[] args)
    {
        IEnumerable<char> source = "Not what you might expect";
        foreach (char vowel in "aeiou")
        {
            source = Enumerable.Where<char>(source, delegate (char c) {
                return c != vowel;
            });
        }
        foreach (char ch in source)
        {
            Console.Write(ch);
        }
        Console.ReadLine();
    }


    有可能是 closure 的問題吧! 在foreach中多加入 取得值,再傳入!

    原本沒有的話,會變成 vowel的值 為 u ,所以就filter不到任何資料

    IEnumerable<char> query = "Not what you might expect";
    foreach (char vowel in "aeiou"){
    	var v = vowel;
    	query = query.Where(c => c != v);
    }
    
    foreach (char c in query)
    	Console.Write(c); //Not what yo might expect
    Console.ReadLine();

      詳細可參考:Closing over the loop variable considered harmful

    C#5.0有做一些改變!

    • C# 4.0 released with .NET 4 and VS2010 (April 2010). Major new features: late binding (dynamic), delegate and interface generic variance, more COM support, named arguments and optional parameters
    • C# 5.0 released with .NET 4.5 in August 2012. Major features: async programming, caller info attributes.

    http://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已编辑 亂馬客 2014年12月29日 9:32
    • 已标记为答案 lctk 2014年12月29日 10:45
    • 取消答案标记 lctk 2015年1月11日 12:43
    • 已标记为答案 lctk 2015年2月4日 10:34
    2014年12月29日 9:14
  • Hello,

    >>请问vs2010vs2012linq的使用有哪些区别(能不能重点说说延迟执行)

    LINQVS的版本没有直接关系,硬要说的话,VS2010默认使用.NET 4.0VS2012默认使用4.5,而且据我所知,这两个版本的LINQ也没太大改动,(如果你知道的话,可以分享一下)。

    关于延迟执行, 相信网上应该有很多的例子,推荐你看微软的官方文档:

    http://msdn.microsoft.com/en-us/library/bb943859(v=vs.120).aspx

    下面也提供了一个example:

    http://msdn.microsoft.com/en-us/library/bb669162.aspx

    可以看到在执行查询的时候,那个扩展方法并没有被执行,在foreach里才真正的执行查询.

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 lctk 2014年12月29日 10:50
    • 取消答案标记 lctk 2015年1月11日 12:43
    • 已标记为答案 lctk 2015年2月4日 10:34
    2014年12月29日 6:22
    版主

全部回复

  • Hello,

    >>请问vs2010vs2012linq的使用有哪些区别(能不能重点说说延迟执行)

    LINQVS的版本没有直接关系,硬要说的话,VS2010默认使用.NET 4.0VS2012默认使用4.5,而且据我所知,这两个版本的LINQ也没太大改动,(如果你知道的话,可以分享一下)。

    关于延迟执行, 相信网上应该有很多的例子,推荐你看微软的官方文档:

    http://msdn.microsoft.com/en-us/library/bb943859(v=vs.120).aspx

    下面也提供了一个example:

    http://msdn.microsoft.com/en-us/library/bb669162.aspx

    可以看到在执行查询的时候,那个扩展方法并没有被执行,在foreach里才真正的执行查询.

    Regards.


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 lctk 2014年12月29日 10:50
    • 取消答案标记 lctk 2015年1月11日 12:43
    • 已标记为答案 lctk 2015年2月4日 10:34
    2014年12月29日 6:22
    版主
  • IEnumerable<char> query = "Not what you might expect";
                foreach (char vowel in "aeiou")
                    query = query.Where(c => c != vowel);

                foreach (char c in query)
                    Console.Write(c); //Not what yo might expect
                Console.ReadLine();

    这段代码在vs2010和2012输出结果不同?请问什么原因?


    please verify my account

    2014年12月29日 7:38
  • 嗯! 差在編譯出來的Code不同!

    VS2013編譯出來如下,

    private static void Main(string[] args)
    {
        IEnumerable<char> source = "Not what you might expect";
        string str = "aeiou";
        for (int i = 0; i < str.Length; i++)
        {
            char vowel = str[i];
            source = Enumerable.Where<char>(source, delegate (char c) {
                return c != vowel;
            });
        }
        foreach (char ch in source)
        {
            Console.Write(ch);
        }
        Console.ReadLine();
    }


    VS2010編譯如下,

    private static void Main(string[] args)
    {
        IEnumerable<char> source = "Not what you might expect";
        foreach (char vowel in "aeiou")
        {
            source = Enumerable.Where<char>(source, delegate (char c) {
                return c != vowel;
            });
        }
        foreach (char ch in source)
        {
            Console.Write(ch);
        }
        Console.ReadLine();
    }


    有可能是 closure 的問題吧! 在foreach中多加入 取得值,再傳入!

    原本沒有的話,會變成 vowel的值 為 u ,所以就filter不到任何資料

    IEnumerable<char> query = "Not what you might expect";
    foreach (char vowel in "aeiou"){
    	var v = vowel;
    	query = query.Where(c => c != v);
    }
    
    foreach (char c in query)
    	Console.Write(c); //Not what yo might expect
    Console.ReadLine();

      詳細可參考:Closing over the loop variable considered harmful

    C#5.0有做一些改變!

    • C# 4.0 released with .NET 4 and VS2010 (April 2010). Major new features: late binding (dynamic), delegate and interface generic variance, more COM support, named arguments and optional parameters
    • C# 5.0 released with .NET 4.5 in August 2012. Major features: async programming, caller info attributes.

    http://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/



    • 已编辑 亂馬客 2014年12月29日 9:32
    • 已标记为答案 lctk 2014年12月29日 10:45
    • 取消答案标记 lctk 2015年1月11日 12:43
    • 已标记为答案 lctk 2015年2月4日 10:34
    2014年12月29日 9:14
  •  多谢答复,能不能介绍点学习方法?

    please verify my account

    2014年12月29日 11:02
  • 這圖太牛了吧!

    之前我看的是「深入理解C#」,您可以參考看看哦!


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年12月30日 1:27