是否有任何与平台无关的(而不是CLI)移动可以使LINQ以某种方式用于C++?
我的意思是,世界上很大一部分服务器框架都运行在UNIX上,在UNIX上访问LINQ for C++可能会让很多人感到高兴!
洪江的Linq++看起来是一个良好的开端。它的语法比CLinq更接近Linq。pfultz2的Linq看起来也很有趣,但它需要一个C++11编译器。
这是我的模板C++LINQ库的解决方案
源代码在这里:Boolinq
每个功能都有很多测试
我现在正在努力
有什么意见吗
可能是建议
更新:项目已移动到https://github.com/k06a/boolinq现在有2.0版本,只有700行源代码:)
微软刚刚宣布他们已经为C和C++构建了LINQ。不过目前还没有。
2012年6月11日更新:
Microsoft Open Technologies,股份有限公司现已发布并开源(Apache License 2.0)许多相关库,包括LINQ实现(Ix++)和新的反应式扩展(Rx++)库。
更新08/15/2023:
所有支持反应式扩展的语言,包括C/C++,现在都在这里
http://cpplinq.codeplex.com/是一个非常好的实现
发件人:
CppLinq的动机是boolinq和Native RX似乎都是基于运算符"."来组成列表函数的。问题是"."运算符在C++中不能重载,这使得很难用我自己设计的函数来扩展这些库。对我来说这很重要。CppLinq是基于运算符>>的,运算符>>是可重载的,因此CppLinq可以进行扩展。
您可以看看PSade。Oven,一个强大的增强库,处理STL范围,并提供许多类似LINQ的功能。
我写了一个小库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("%.2fn", 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: %in", x.first.c_str(), x.second);
}
将输出:
Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
这里有另一个替代方案,它只是围绕boost和stl算法进行包装,因此您可以获得这些实现的大部分性能优势。
它是这样工作的:
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++0x,或者它最终被调用的任何东西,确实有一个名为auto
的新关键字,它允许类型推断。是的,C++会有lambda。此外,谷歌的快速搜索揭示了这一点,CLinq。
下面是我用c++11实现的c++-linq(中文):
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
它支持诸如"延迟查询"、"基于堆栈"(尽可能少地使用运算符new)、"复制语义"(这样你就可以在备份后多次迭代查询)等功能
它还支持数十个函数,包括"from,select,where,cast,range,all,any,cast,average,contain,count,first,last,head,tail,groupBy,takeUntil,skipUntil、max,min,reduce,unique,sort,random,intersect,_union"。
我认为我的代码足够简单,任何人都可以理解和扩展。
我认为C++没有编译器的能力来处理lambda表达式之类的事情,所以不,这不会发生。