好吧,我不会给你你想要的答复,但无论如何都会是答复:-)
LINQ 主要用于 C#。我认为您的用例应该是将 C# 代码翻译成 C++,但我认为 C++ 中的有效方法是使用Boost.Range。
Boost.Range 以一种易于查询数据的方式重用 c++ 标准库:
- 您可以将适配器用于具有从左到右表示法的容器,使用
operator |
. 就像在 LINQ 中一样,它们是惰性求值的。
- 您可以执行诸如
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
,但我认为作为一种查询语言,现在,它是完全可以接受的。