是否有任何平台不可知(而非CLI)动作以某种方式让LINQ进入C ++?
我的意思是世界各地的服务器框架很大程度上运行在UNIX上,并且在UNIX上访问LINQ for C ++可能会让很多人满意!
答案 0 :(得分:33)
答案 1 :(得分:17)
Microsoft已just announced他们为C和C ++构建了LINQ。但是还没有。
更新11/06/2012:
Microsoft Open Technologies,Inc。现在有released和open-sourced(Apache License 2.0)许多相关库,包括LINQ实现(Ix ++),以及它的新Reactive Extensions(Rx ++)库
答案 2 :(得分:13)
这是我的模板C ++ LINQ库的解决方案
源代码在这里:Boolinq
每个功能都有很多测试
我现在正在努力。
有何评论?
可能是建议吗?
更新:项目移至https://github.com/k06a/boolinq,现在版本2.0只有700行源代码:)
答案 3 :(得分:8)
http://cpplinq.codeplex.com/是一个非常好的实现。
来自作者:
CppLinq的动机是boolinq和Native-RX似乎都是基于运算符“。”。编写列表函数。问题是“。”运算符是它不能在C ++中重载,这使得很难用我自己设计的函数扩展这些库。对我来说这很重要。 CppLinq基于运算符>>这是可以超载的,因此可以使CppLinq具有可扩展性。
答案 4 :(得分:7)
您可以查看PSade.Oven,这是一个强大的工作在STL范围的库,并提供很多类似LINQ的函数。
答案 5 :(得分:7)
我写了一个小型库cppLinq,它重新实现了IEnumerable<>和它的LINQ运算符。这只是一个实验;目前它只适用于Windows(协同程序是用Win32光纤实现的),并且只使用VS11的Dev Preview进行构建(它大量使用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);
});
答案 6 :(得分:3)
实际上,如果您只想使用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
答案 7 :(得分:3)
这是另一个alternative,它只是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);
欢迎反馈。
答案 8 :(得分:2)
答案 9 :(得分:2)
这是我实现的c ++ - linq with c ++ 11(中文):
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
它支持“延迟查询”,“基于堆栈”(尽可能少使用operator new),“复制语义”(因此可以在备份后多次迭代查询)等功能,等等。
它还支持许多功能,包括“从,选择,在哪里,演员,范围,全部,任何,演员,平均,包含,计数,第一,最后,头,尾,groupBy,takeUntil,skipUntil,max,min ,减少,独特,排序,随机,交叉,_union“。
我认为我的代码非常简单,可以被任何人自己理解和扩展。
答案 10 :(得分:-3)
我认为C ++没有编译器来处理诸如lambda表达式之类的东西,所以不,这不会发生。