7

C#LINQdotsintaxを使用してVS2010互換のC++linqライブラリを検索します。次のような意味:from(...).where(...).orderBy.firstOrDefault();

私はグーグルでこれを見つけたので、LINQライブラリコレクション/混乱に答えてください:

ドット表記を使用していないことがわかったその他の方法..btwpfultz2/ LinqはorderByを提供しているようですが、最初にLINQ sintaxやLimitationsなどのSQLにより、私が探していないものになっています=(

では、ドット表記、orderBy、firstOrDefaultを備えたオープンソースのC ++ LINQライブラリはありますか?

4

1 に答える 1

1

まあ、私はあなたが望むような返事はしませんが、とにかく返事をします:-)

LINQ は主に C# 向けと考えられています。あなたのユース ケースは C# コードを C++ に変換するためのものだと思いますが、C++ で効果的な方法はBoost.Rangeを使用することだと思います。

Boost.Range は、データに対してクエリを実行しやすい方法で C++ 標準ライブラリを再利用します。

  1. を使用して、左から右への表記でコンテナーのアダプターを使用できますoperator |。これらは、LINQ と同様に遅延評価されます。
  2. std::min, std::max, std::all_of, std::any_of, std::none_of適応範囲内などの操作ができます。

先日書いた例は、文字列内の単語を逆にする方法です。解決策は次のようなものでした:

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が、クエリ言語としては、現時点では許容範囲を超えていると思います。

于 2013-11-18T05:53:38.727 に答える