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

时间:2008-10-24 01:40:28

标签: c++ linq unix

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

我的意思是世界各地的服务器框架很大程度上运行在UNIX上,并且在UNIX上访问LINQ for C ++可能会让很多人满意!

11 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:17)

Microsoft已just announced他们为C和C ++构建了LINQ。但是还没有。

更新11/06/2012:

Microsoft Open Technologies,Inc。现在有releasedopen-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)

C ++ 0x,或者它最终被调用的任何东西,都有一个名为auto的新关键字,它允许类型推断。是的,将会有用于C ++的lambda。此外,快速Google搜索显示了这一点,CLinq

答案 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表达式之类的东西,所以不,这不会发生。