LINQ查询理解 - 为什么需要System.Linq命名空间?

时间:2012-03-09 00:26:15

标签: c# linq

我的一位同事和我今天正在就Linq进行讨论。特别是,在可以使用查询推导之前,需要包含System.Linq命名空间(通过usings)。我认为这样做是为了不太可能错误地使用非Linq扩展方法,但我们从未得出结论。使用查询推导时,为什么应该/不应该包含System.Linq命名空间?

3 个答案:

答案 0 :(得分:3)

这听起来很明显,但是当我们打算使用Framework提供的LINQ工具时,应该包含System.Linq命名空间。但没有什么可以阻止我们使用自己的,编译器也不介意。

例如,以下(愚蠢,但完整!)代码片段编译并运行得非常好:

// no usings at all
static class DumbLinq
{
    static int Select(this int i, System.Func<int, int> f)
    {
        // actually, our Select is a negation operator in disguise
        return -i;
    }

    static void Main()
    {
        int i = 10;
        var j = from n in i
                select n;
        System.Console.WriteLine(j); // prints -10
    }
}

编译器在编译代码之前简单地将查询理解语法转换为“流畅”语法。一旦找到合适的使用方法,就会照常进行。通过using System.Linq,我们确保编译器将找到支持使用LINQ的查询的类和接口,仅此而已。

答案 1 :(得分:3)

不,您不需要包含System.Linq以使查询理解起作用 - 请参阅示例。

using System;
using System.Collections.Generic;

namespace SelectQuery
{

    internal static class MyExtensions
    {
        public static IEnumerable<int> Select(this int[] items, Func<int, int> selector)
        {
            return items;

        }
    }

    class Program
    {

        static void Main(string[] args)
        {
            int[] data = new[] { 1, 2, 34 };

            var result = from v in data select v;
            foreach (var i in result)
            {
                Console.WriteLine(i);
            }
        }
    }
}

答案 2 :(得分:0)

因为Linq库就是一个库。如果您不需要它,则不要将其包含在内存空间中,或引用DLL。

但是linq功能基本上是针对IEnumerable<T>运行的,它们只是方法,当您想要使用查询语法时,C#编译器会有一点点糖。