何らかの方法でLINQをC ++に移行させるための、プラットフォームに依存しない(CLIではない)動きはありますか?
つまり、世界中のサーバーフレームワークの大部分がUNIXのフレーバーで実行されており、UNIX上のLINQ for C ++にアクセスできると、多くの人が喜ぶでしょう。
何らかの方法でLINQをC ++に移行させるための、プラットフォームに依存しない(CLIではない)動きはありますか?
つまり、世界中のサーバーフレームワークの大部分がUNIXのフレーバーで実行されており、UNIX上のLINQ for C ++にアクセスできると、多くの人が喜ぶでしょう。
回答:
HongJiangによるLinq ++は良いスタートのように見えます。その構文は、CLinqよりもLinqにはるかに近いものです。pfultz2によるLinqも面白そうに見えますが、C ++ 11コンパイラが必要です。
これは、テンプレートC ++ LINQライブラリの私のソリューションです。
ソースコードはこちらです:Boolinq
各機能には多くのテストがあります。
私は今それに取り組んでいます。
コメントはありますか?
アドバイスかもしれませんか?
更新:プロジェクトはに移動しました https://github.com/k06a/boolinqに、バージョン2.0になりました。ソースコードは700行のみです:)
Q_FOREACH
。おそらくQ_FOREACH
段階的に廃止されたためです。
#define foreach for_each
後に#undef foreach
、Qtヘッダーを含めるように定義してみてください。
マイクロソフトはちょうど発表しました、CおよびC ++用のLINQを構築したことをしました。ただし、まだ利用できません。
2012年11月6日更新:
Microsoft Open Technologies、Inc。は、LINQ実装(Ix ++)や新しいReactive Extensions(Rx ++)ライブラリなど、多数の関連ライブラリをリリースしてオープンソース(Apache License 2.0)にしています。
http://cpplinq.codeplex.com/は非常に優れた実装です。
著者から:
CppLinqの動機は、boolinqとNative-RXの両方が演算子に基づいているように見えることです。」リスト関数を作成します。問題は「。」ということです。演算子は、C ++でオーバーロードできないため、これらのライブラリを自分の設計の関数で拡張するのが難しいということです。私にとってこれは重要です。CppLinqは、オーバーロード可能な演算子>>に基づいているため、CppLinqを拡張可能にすることができます。
PSade.Ovenをご覧ください。これは、STL範囲で動作し、多くのLINQのような関数を提供する強力に強化されたライブラリです。
私は小さなライブラリcppLinqを書きましたIEnumerable <>とそのLINQ演算子を再実装を。これは単なる実験です。今のところ、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);
});
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をできるだけ使用しない)、「コピーセマンティック」(バックアップ後にクエリを複数回繰り返すことができる)などの機能をサポートします。
また、「from、select、where、cast、range、all、any、cast、average、contain、count、first、last、head、tail、groupBy、takeUntil、skipUntil、max、min、reduce、」など、数十の関数をサポートしています。一意、並べ替え、ランダム、交差、_union "。
私のコードは、誰でも理解して拡張できるほど単純だと思います。
C ++には、ラムダ式などを処理するためのコンパイラーシュガーがないと思います。そのため、それは起こりません。
from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)
std :: vector <Person>から5人の最年少の大人を選択してそれらを返すアルファベット順。... C ++は、タスクのために適切であることを言うだろう、私はそう
Expression<T>
は、C#のドキュメントを参照してください。