是否有用于C++的LINQ库?

Rob*_*uld 79 c++ linq unix

是否有任何平台不可知(而非CLI)动作以某种方式让LINQ进入C++?

我的意思是世界各地的服务器框架的很大一部分运行在UNIX的风格上,并且在UNIX上访问LINQ for C++可能会让很多人开心!

js.*_*js. 34

Hong Jiang的Linq ++看起来是一个好的开始.它的语法比Linin更接近Linq而不是CLinq.Linq by pfultz2看起来很有趣,但它需要一个C++ 11编译器.


Dav*_*cia 18

微软刚刚宣布他们已经为C和C++构建了LINQ.但是还没有.

更新11/06/2012:

Microsoft Open Technologies,Inc.现已发布开源(Apache License 2.0)许多相关库,包括LINQ实现(Ix ++),以及它的新Reactive Extensions(Rx ++)库.


k06*_*06a 16

这是我的模板C++ LINQ库的解决方案.
源代码在这里:Boolinq
每个功能都有很多测试.
我现在正在努力.

任何意见?
可能是建议?

更新:项目转移到https://github.com/k06a/boolinq,现在有2.0版本,只有700行源代码:)


yuf*_*fan 8

http://cpplinq.codeplex.com/是一个非常好的实现.
来自作者:
CppLinq的动机是boolinq和Native-RX似乎都是基于运算符".".编写列表函数.问题是"." 运算符是它不能在C++中重载,这使得很难用我自己设计的函数扩展这些库.对我来说这很重要.CppLinq基于运算符>>,它是可重载的,因此CppLinq可以是可扩展的.


小智 7

您可以看看PSade.Oven,一个强大的增强库,可以处理STL范围并提供很多类似LINQ的函数.


Pao*_*ini 7

我编写了一个小型库cppLinq,它重新实现了IEnumerable <>及其LINQ运算符.这只是一个实验; 目前它仅适用于Windows(协同程序使用Win32光纤实现),并且只使用VS11的开发预览版构建(它大量使用lambda表达式:-)).

它允许编写如下代码:

auto source = IEnumerable<int>::Range(0, 10);

auto it = source->Where([](int val) { return ((val % 2) == 0); })
                ->Select<double>([](int val) -> double { return (val * val); }));

foreach<double>(it, [](double& val){
    printf("%.2f\n", val);
});
Run Code Online (Sandbox Code Playgroud)

  • 盲目地将C#转换为C++并不会对任何人有任何好处.为什么需要接口?如果你摆脱了那些,你摆脱了所有那些无用的分配和poiner语法.如果你不能,至少将`shared_ptr`切换到`unique_ptr`,因为后者可以转换为前者,但反之亦然.另外,样式很好,你不需要` - > double`返回类型.让隐含的转换完成他们的工作. (7认同)
  • 基于表达式模板的静态方法就是我的想法.[阅读它.](http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template) (5认同)
  • 谢谢你的评论.是的,上面示例中的lambda可能会有所改进,但它只是一个细节.不过,我不知道我能对shared_ptrs和指针做些什么.我们的想法是使用协同程序实现迭代器块,确切地说它们是如何在C#中实现的,以便提供惰性求值和数据管道.例如,在源头我们可以从STL容器中"生成"数据,但是我们有一组必须像IEnumerators一样运行的组件,从而产生来自协同例程的数据.对于C++版本的LINQ,您会想到什么界面? (2认同)
  • 嗯..只需在解除引用迭代器时应用您想要的任何内容.另外,请查看[Boost.Range](http://www.boost.org/doc/libs/1_48_0/libs/range/doc/html/index.html). (2认同)

Pau*_* II 6

实际上,如果您只想使用 Linq 进行列表理解,您可以使用这个Linq库。它需要 C++11(不过它可以在 MSVC 2010 中工作)和 Boost。使用该库,您可以编写像这样的 linq 查询:

struct student_t
{
    std::string last_name;
    std::vector<int> scores;
};

std::vector<student_t> students = 
{
    {"Omelchenko", {97, 72, 81, 60}},
    {"O'Donnell", {75, 84, 91, 39}},
    {"Mortensen", {88, 94, 65, 85}},
    {"Garcia", {97, 89, 85, 82}},
    {"Beebe", {35, 72, 91, 70}} 
};

auto scores = LINQ(from(student, students) 
                   from(score, student.scores) 
                   where(score > 90) 
                   select(std::make_pair(student.last_name, score)));

for (auto x : scores)
{
    printf("%s score: %i\n", x.first.c_str(), x.second);
}
Run Code Online (Sandbox Code Playgroud)

这将输出:

Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
Run Code Online (Sandbox Code Playgroud)


Fly*_*wat -5

我认为 C++ 没有编译器糖来处理 lambda 表达式之类的事情,所以不,这不会发生。

  • Boost.Phoenix 库还在 C++ 中添加了 Lambda,无需任何预编译器技巧。请参阅 http://tinyurl.com/d4y9se [boost.org] 当然,使用 C++0x 很多事情变得更容易!一篇很好的文章如何使用 c++0x 进行 LINQ http://tinyurl.com/d9zlsc [blogspot.com] (7认同)
  • C++ 0X 有 lambda,所以理论上应该是可能的,但是这不是一件容易的事。 (5认同)
  • 哈哈,在 boost::lambda 的帮助下,一些模板技巧以及在某种情况下预编译器我能够想出以下语法: `from(v).where(&amp;_1 -&gt;* &amp;Person::age &gt;= 18).order_by(Person, Age).top(5).order_by(Person, name)` 从 std::vector&lt;Person&gt; 中选择五个最年轻的成年人,并按字母顺序返回它们。所以我想说 C++ 足以完成这项任务...... (3认同)