是否有一个C ++的LINQ库?

是否有任何平台不可知论(而不是CLI)的运动来获得LINQ以某种方式去C ++?

我的意思是世界各地的UNIX服务器框架的很大一部分运行在UNIX上,并且在UNIX上可以访问LINQ for C ++可能会使很多人感到高兴!

洪江的Linq ++看起来不错。 它的语法比CLINQ更接近Linq。 Linq by pfultz2看起来也很有趣,但它需要一个C ++ 11编译器。

微软刚刚宣布他们为C和C ++构build了LINQ。 但尚未提供。

2012年11月6日更新:

微软开放技术公司现已发布并开源 (Apache许可证2.0)许多相关的库,包括一个LINQ实现(Ix ++),以及新的Reactive Extensions(Rx ++)库。

这是我的模板C ++ LINQ库的解决scheme。
源代码在这里: Boolinq
每个function都有很多testing。
我正在处理它。

任何意见?
可能是build议?

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

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

你可以看看PSade.Oven ,一个强大的强化库,在STL范围上工作,并提供很多类似LINQ的函数。

我已经写了一个小的库cppLinq来重新实现IEnumerable <>和它的LINQ操作符。 这只是一个实验; 现在它只能在Windows上运行(使用Win32光纤来实现协程),并且只能使用VS11的Dev Preview(它大量使用lambdaexpression式:-))。

它允许编写这样的代码:

 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); }); 

其实如果你只是想用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); } 

哪个会输出:

 Omelchenko score: 97 O'Donnell score: 91 Mortensen score: 94 Garcia score: 97 Beebe score: 91 

C ++ 0x,或者最后被调用的任何东西,都会有一个新的关键字auto ,它允许进行types推断。 是的,会有lambda的C ++的到来。 此外,快速谷歌search显示这一点, CLinq 。

这里是另一个简单的boost和stlalgorithm的包装,因此您可以获得这些实现的大部分性能优势。

它是这样工作的:

 std::vector<int> xs; auto count = from(xs) .select([](int x){return x*x;}) .where([](int x){return x > 16;}) .count(); auto xs2 = from(xs) .select([](int x){return x*x;}) .to<std::vector<int>>(); 

请注意,一些方法返回空范围代理,例如

 std::vector<int> xs; auto max = from(xs) .select([](int x){return x*x;}) .where([](int x){return x > 16;}) .max() .value_or(default_max_value); 

欢迎反馈。

这里是我的C ++实现 – linq与c + + 11(中文):

http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html

它支持“延迟查询”,“基于堆栈”(尽可能less使用操作符new),“复制语义”(这样您可以在备份后迭代多重查询)等function。

它还支持“from,select,where,cast,range,all,any,cast,average,contains,count,first,last,head,tail,groupBy,takeUntil,skipUntil,max,min,reduce等几十个函数。独特,sorting,随机,相交,_union“。

我认为我的代码很简单,可以被任何人自己理解和扩展。

我不认为C ++有编译器糖来处理诸如lambdaexpression式之类的东西,所以不,这不会发生。