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

Linq有多独特?

  •  9
  • andy  · 技术社区  · 15 年前

    这是一个关于linq.net语言功能的问题, LINQtoSQL

    我发现以这样一致和声明性的方式查询几乎任何内存中集合的能力是我遇到过的最好的语言特性之一。

    我发现它非常有用,我喜欢它提供的干净抽象。LINQ甚至可以用于查询字符串,实际上它非常灵活。

    我的问题是:

    1. “语言集成查询”的概念是新的吗?如果没有,还有什么其他语言实现了类似的特性
    2. 其他实现与微软的相比如何?
    3. 这有点主观,但作为一个想法,其他人觉得LINQ有多重要?

    干杯

    8 回复  |  直到 15 年前
        1
  •  7
  •   mfawzymkh    15 年前

    语言集成查询的概念并不是新的,MS所说的方式是独特的和新的。 它受haskell和sql语法的影响,haskell有枚举器和延迟评估的思想,这是实现linq的核心强调原则,实际上linq只是一种语法糖。

    我觉得链接是一个伟大的桥梁之间的推理,你的程序和数据的抽象和干净的方式。

        2
  •  3
  •   JaredPar    15 年前

    作为内存中集合的查询,不,这不是一个独特的特性。以F的管道前进操作器为例。它允许您编写与LINQ查询非常相似的样式操作。

    例如,以下代码从字符串中提取数字并对其求和

    "foobar42".ToCharArray() 
      |> Seq.filter System.Char.IsDigit 
      |> Seq.map (fun x -> x.ToString() ) 
      |> Seq.map System.Int32.Parse 
      |> Seq.sum
    
        3
  •  2
  •   dplante Tschallacka    15 年前

    我觉得Linq很有趣。

    记住,它本质上为.NET添加了强大的功能编程功能。

    有趣的是,微软不必改变运行时来让linq工作,所有的魔力都是因为C 3、编译器和类库中的新语言功能,因为基本上你的查询会被内部转换为lambda语法(请参阅linqpad了解这方面的良好演示)

    我相信MS开发这种技术的原因之一是为了使并行程序更容易——SQL可能因为LINQ而变得不那么重要。

        4
  •  2
  •   KdgDev    15 年前

    我想Linq.net已经开始了。现在,还有其他几种实现方式: http://en.wikipedia.org/wiki/Linq#Other_language_implementations 但如果我没记错的话,林克女士是第一个。

        5
  •  2
  •   Michael Dunn    15 年前

    在微软内部,在C-omega(cw)被C和VB采用之前,它开发了一种非常相似的语法。

        6
  •  2
  •   Ana Betts    15 年前

    linq中的概念(其中,select,aggregate)已在lisp中用于 现在,这些根本不是新的。不过,C中的实现特别优雅,尤其是它如何添加一个相当具有破坏性的概念,同时又与现有的C 2.0代码完美融合。“reinterpret linq ast as sql”也相当聪明。

        7
  •  2
  •   Steve    15 年前

    “语言集成查询”的概念是新的吗?如果没有,还有什么其他语言实现了类似的特性

    如果你认为SQL是一种语言,那就不行了。我认为MS的洞见是,类似数组的容器中的所有东西本质上都是内存中的数据库。不仅如此,对这些集合的许多操作都是相同的。程序员必须在一年中写出数百万个.selects,.wheres和.first。这些实现中的许多都有临时数组和变量,它们会使代码混乱。使用LINQ,逻辑变得更加简洁,而不需要温度/保持器变量/数组。微软用标准的LINQ操作符消除了一整类错误。

    其他实现与微软的相比如何?不确定

    这有点主观,但作为一个想法,其他人觉得LINQ有多重要?

    我觉得Linq很可能是我见过的最具革命性的语言特性,而且我认为闭包也非常棒。它使程序更干净,程序员的工作效率更高。

        8
  •  2
  •   Yann Schwartz    15 年前

    Linq与很多事情有关 List comprehensions 您可以在函数语言和更主流的语言(如python)中找到,在相当长的一段时间内,它一直是一个标准的、使用非常广泛的特性。

    为了更好地理解列表,这个python函数取自 simple spell checker Peter Norvig

    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,在表达式的开头编写了(隐式)select,而不是像linq那样奇怪地在末尾。

    在python中,lambda有点不受欢迎,而python中的默认列表理解也很迫切(想想 List<T> )而不是懒惰( IEnumerable<T> )但它非常接近。

    至于拥有(某种程度上)纯函数链的概念,就像其他人在这里回答的那样,它是计算机语言中最古老的概念之一(Lisp现在已经超过50了…)