是否有任何与平台无关的(而非CLI)运动使LINQ以某种方式适用于C ++?
我的意思是说,全世界很多服务器框架都运行在UNIX风格上,并且可以在UNIX上访问LINQ for C ++。
是否有任何与平台无关的(而非CLI)运动使LINQ以某种方式适用于C ++?
我的意思是说,全世界很多服务器框架都运行在UNIX风格上,并且可以在UNIX上访问LINQ for C ++。
Answers:
这是我的模板C ++ LINQ库的解决方案。
源代码在这里:Boolinq
每个功能都有很多测试。
我正在研究它。
任何意见?
可能是建议?
更新:项目移至https://github.com/k06a/boolinq,现在具有仅700行源代码的2.0版:)
Q_FOREACH
。可能是由于Q_FOREACH
被淘汰。
#define foreach for_each
在include:之后#undef foreach
,然后包括Qt标头。
http://cpplinq.codeplex.com/是一个非常好的实现。
来自作者:
CppLinq的动机是boolinq和Native-RX似乎都基于运算符。” 组成列表功能。问题在于“。” 运算符是它不能在C ++中重载,这使得很难用我自己设计的功能扩展这些库。对我来说,这很重要。CppLinq基于运算符>>,该运算符是可重载的,因此可以使CppLinq可扩展。
我编写了一个小的库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);
});
shared_ptr
s切换为unique_ptr
s,因为后者可以转换为前者,反之亦然。另外,样式很复杂,您不需要-> double
返回类型。只需让隐式转换发挥作用即可。
这是另一个替代方案,只是将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);
欢迎反馈。
实际上,如果您只想使用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 ++ 11(中文)实现的c ++-linq:
http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html
它支持“延迟查询”,“基于堆栈”(尽可能少使用new运算符),“复制语义”(因此您可以在备份后多次迭代查询)等功能。
它还支持数十种功能,包括“从,选择,何处,强制转换,范围,所有,任何,投射,平均,包含,计数,第一,最后,头,尾,groupBy,takeUntil,skipUntil,max,min,reduce唯一,排序,随机,相交,_联盟”。
我认为我的代码很简单,任何人都可以理解和扩展。
我不认为C ++具有编译器糖来处理诸如lambda表达式之类的事情,所以不,那不会发生。
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
从std :: vector <Person>中选择五个最年轻的成年人并返回他们按字母顺序。因此,我想说C ++足以胜任这项任务……
Expression<T>
参见C#文档。