2013-03-16 19 views
7

C#LINQ dot sintaxでVS2010に対応するC++ linqライブラリを検索します。以下のようなものの意味:from(...).where(...).orderBy.firstOrDefault();ドット表記、orderBy、firstOrDefaultを持つOpensource C++ LINQライブラリ?

を私はGoogleで検索して、このso answer LINQ libraries collection/messが見つかりました:

など..ところでpfultz2/Linqは、私は=(

を捜しているわけではない何かがそうTHERいずれかですORDERBYと第一、まだLINQのsintaxのようなそのSQLを提供してLimitationsそれを作るように見えますドット表記法、orderBy、firstOrDefaultを持つopensource C++ LINQライブラリ?

+0

「安定した」ソートという用語は特別な意味を持っています(http://en.wikipedia.org/wiki/Sorting_algorithm#Stability)。私はあなたがここで意味するとは思わない - 言い換えれば言いたいことです。 –

+0

@EamonNerbonne:言い換えられた。 – myWallJSON

+0

あなたのニーズをすべて満たすものがない場合。ハッキングを開始する時期です。それらの中で最も強いものを増強するか、自分のものを始めることができます。 –

答えて

1

まあ、私はあなたが望む回答を与えることはありませんが、それは主にC#のために考えられている

LINQ :-)とにかく返事になります。あなたのユースケースはC#コードをC++に変換するためのものであるべきだと思いますが、C++の効果的な方法はBoost.Rangeを使用することです。あなたはoperator |を使用して右の表記に左とコンテナのためのアダプタを使用することができます

  1. Boost.Rangeは、データにクエリを実行しやすい方法で、C++標準ライブラリを再利用します。 LINQと同様に遅延評価されます。

  2. 調整された範囲でstd::min, std::max, std::all_of, std::any_of, std::none_ofなどの操作を実行できます。

私が書いた例の1つは、文字列の単語を逆にする方法です。これは非常に長い時間のためにサポートされようとしていると私はそれが未来になると思うので、私は非常に、このライブラリ時にクエリをベースにすることをお勧めします

using string_range = boost::iterator_range<std::string::const_iterator>; 

struct submatch_to_string_range { 
    using result_type = string_range; 

    template <class T> 
    string_range operator()(T const & s) const { 
     return string_range(s.first, s.second); 

    } 
}; 

string sentence = "This is a sentence"; 

auto words_query = sentence | 
       ba::tokenized(R"((\w+))") | 
       ba::transformed(submatch_to_string_range{}) | 
       ba::reversed;   


vector<string_range> words(words_query.begin(), words_query.end()); 

for (auto const & w : words) 
cout << words << endl; 

: ソリューションは、このようなものでした。 同じスタイルのクエリを実行できます。

このライブラリを| max| to_vectorのように拡張して、ベクターに直接名前を付けたりコピーしたりしないようにすればいいと思いますが、今はクエリ言語としては受け入れられています。