这是一个关于LINQ .NET语言功能的问题,不是 LINQ to SQL。
我发现以这种一致和声明的方式查询几乎任何内存集合的能力是我遇到过的最好的语言特性之一。
我发现它非常有用,我喜欢它提供的干净抽象。 LINQ甚至可以用来查询字符串,实际上它非常灵活。
我的问题是:
欢呼声
答案 0 :(得分:7)
语言综合查询的想法并不新鲜,MS提出的方式是独一无二的。 它受Haskell和SQL语法的影响,Haskell有枚举器和惰性求值的概念,这是实现LINQ的核心下划线原则,实际上LINQ只是一个语法糖。
我觉得链接是以抽象和干净的方式推理程序和数据之间的一个很好的桥梁。
答案 1 :(得分:3)
作为对内存集合的查询,这不是一个独特的功能。以F#的管道运营商为例。它允许您编写与linq查询非常相似的样式操作。
例如,以下代码从字符串中提取数字并将它们相加
"foobar42".ToCharArray()
|> Seq.filter System.Char.IsDigit
|> Seq.map (fun x -> x.ToString() )
|> Seq.map System.Int32.Parse
|> Seq.sum
答案 2 :(得分:2)
我认为LINQ非常有趣。
请记住,它本质上为.NET添加了强大的函数式编程功能
有趣的是,微软没有必要改变运行时来使LINQ工作,所有的神奇之处在于C#3以及编译器和类库中的新语言特性 - 因为基本上你的查询在内部被翻译成lambda语法(参见LINQPad以获得良好的演示)
我相信MS开发此类技术的原因之一是使程序并行化更容易 - 由于LINQ,SQL可能变得不那么重要了。
答案 3 :(得分:2)
我在想LINQ.NET就是这样开始的。如今,还有其他一些实现:http://en.wikipedia.org/wiki/Linq#Other_language_implementations,但如果我没记错的话,MS LINQ是第一个。
答案 4 :(得分:2)
在Microsoft中,在C#和VB采用之前,在C-omega(Cw)中开发了一种非常相似的语法。
答案 5 :(得分:2)
Linq(Where,Select,Aggregate)中的概念现在已经在LISP中年,这些都不是新的。 C#中的实现特别优雅,特别是它如何设法添加一个非常具有破坏性的概念,并与现有的C#2.0代码完美融合。 “将Linq AST重新解释为SQL”也非常聪明。
答案 6 :(得分:2)
Linq与List comprehensions有很多关系,你可以在函数式语言和更主流的语言中找到它们,比如Python,它已经成为一种标准且非常广泛使用的功能。
对于列表推导的一个很好的例子,这个Python函数取自Peter Norvig的simple spell checker
def edits1(word):
s = [(word[:i], word[i:]) for i in range(len(word) + 1)]
deletes = [a + b[1:] for a, b in s if b]
transposes = [a + b[1] + b[0] + b[2:] for a, b in s if len(b)>1]
replaces = [a + c + b[1:] for a, b in s for c in alphabet if b]
inserts = [a + c + b for a, b in s for c in alphabet]
return set(deletes + transposes + replaces + inserts)
它看起来很像Linq,在表达式的开头写了(隐式)选择,而不是像Linq那样奇怪。
lambdas在Python中有点皱眉,Python中的默认列表推导是急切的(想象List<T>
)而不是懒惰(IEnumerable<T>
),但它非常接近。
至于具有(某种程度上)纯函数链的概念,就像其他人在这里回答一样,它是计算机语言中最古老的概念之一(现在Lisp超过50个......)
答案 7 :(得分:2)
“语言综合查询”这个想法是新的吗?如果没有,其他语言实现了类似的功能
如果你认为sql是一种语言,那么没有。我认为MS的洞察力是像容器这样的数组中的所有东西本质上都是内存数据库。不仅如此,而且这些集合中的许多操作都是相同的。程序员必须在一年内写出数百万个.selects,.wheres和.firsts。其中许多实现都有临时数组和变量,使代码混乱。使用LINQ,逻辑更加简洁,没有temp / holder变量/数组。 MS使用标准的LINQ运算符消灭了整个类的错误。
其他实现如何与微软相比?不确定
这有点主观,但其他人认为LINQ作为一个想法有多重要?
我觉得LINQ很可能是我见过的最具革命性的语言功能,而且我认为闭包也非常棒。它使程序更清晰,程序员的工作效率更高。