何らかの方法でLINQをC++に移行させるためのプラットフォームに依存しない(CLIではない)動きはありますか?
世界中のサーバーフレームワークの大部分がUNIXのフレーバーで実行されており、UNIXでLINQ for C++にアクセスできれば、多くの人が幸せになるでしょう。
Microsoftは 発表されたばかり CおよびC++向けのLINQを構築したとしています。ただし、まだ利用できません。
2012年11月6日更新:
Microsoft Open Technologies、Inc.は現在、 released および open-sourced (Apache License 2.0)LINQ実装(Ix ++)を含む多くの関連ライブラリを備えており、新しいReactiveです拡張(Rx ++)ライブラリ。
これがテンプレートC++ LINQライブラリの私のソリューションです。
ソースコードはこちら: Boolinq
各機能には多くのテストがあります。
今取り組んでいます。
コメントはありますか?
アドバイスがありますか?
更新:プロジェクトは https://github.com/k06a/boolinq に移動し、ソースコードが700行のみのバージョン2.0になりました:)
http://cpplinq.codeplex.com/ は非常に優れた実装です。
著者から:
CppLinqの動機は、boolinqとNative-RXの両方がオペレーターに基づいているようだということです。」リスト関数を作成します。問題は、「。」演算子は、C++でオーバーロードできないため、これらのライブラリを自分のデザインの関数で拡張するのが難しくなります。私にとってこれは重要です。 CppLinqはオーバーロード可能なoperator >>に基づいているため、CppLinqは拡張可能にできます。
PSade.Oven をご覧ください。STL範囲で動作し、多くのLINQのような機能を提供する、大幅に強化されたライブラリです。
IEnumerable <>とそのLINQ演算子を再実装する小さなライブラリ cppLinq を作成しました。これは単なる実験です。現時点では、Windows上でのみ動作し(コルーチンはWin32ファイバーで実装されます)、VS11のDev Previewでのみビルドされます(ラムダ式を頻繁に使用します:-))。
次のようなコードを記述できます。
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);
});
ここに別の alternative があります。これは、ブーストアルゴリズムと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 library。 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
「遅延クエリ」、「スタックベース」(できるだけ新しい演算子を使用)、「コピーセマンティック」(クエリをバックアップ後に複数回反復できる)などの機能をサポートします。
また、「from、select、where、cast、range、all、any、cast、average、contain、count、first、last、head、tail、groupBy、takeUntil、skipUntil、max、min、reduce、ユニーク、ソート、ランダム、交差、_union」。
私のコードは誰でも理解して拡張できるほどシンプルだと思います。