2013-03-16 11 views
7

Cerco una libreria linq C++ compatibile VS2010 con sintassi punto C# LINQ. che significa qualcosa come: from(...).where(...).orderBy.firstOrDefault();Libreria LINQ Opensource C++ con notazione dot, orderBy e firstOrDefault?

Ho cercato su google e ho trovato questo so answer LINQ libraries collection/mess:

Altri ho trovato non usando la notazione punto .. btw pfultz2/Linq sembra fornire orderBy e prima ancora la sua SQL come LINQ sintassi e Limitations fanno qualcosa che non sto cercando = (

è così ther qualsiasi libreria opensource C++ LINQ con notazione dei punti, orderBy e firstOrDefault?

+0

Il termine "stabile" sort [ha un significato speciale] (http://en.wikipedia.org/wiki/Sorting_algorithm#Stability), che non penso tu intenda qui - dovresti riformulare. –

+0

@EamonNerbonne: riformulato. – myWallJSON

+0

Se non ce n'è uno che soddisfi tutte le tue esigenze. È ora di iniziare l'hacking. Potresti migliorare uno dei più forti di loro o iniziare da solo. –

risposta

1

Beh, io non vi darà la risposta che si desidera, ma sarà una risposta in ogni caso :-)

LINQ è pensato per C#, soprattutto. Penso che il tuo caso d'uso dovrebbe essere quello di tradurre il codice C# in C++, ma penso che il modo efficace in C++ sia quello di usare Boost.Range.

Boost.Range riutilizza la libreria C++ standard in un modo che è facile da fare interrogare sui dati:

  1. È possibile utilizzare adattatori per contenitori con la notazione sinistra a destra usando operator |. Vengono valutati pigramente, proprio come in LINQ.
  2. È possibile eseguire operazioni come std::min, std::max, std::all_of, std::any_of, std::none_of negli intervalli adattati.

Un esempio che ho scritto l'altro giorno è come invertire le parole in una stringa. La soluzione è stata qualcosa di simile:

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; 

consiglio vivamente di basare le vostre domande su questa biblioteca, dal momento che questo sta per essere supportato per un tempo molto lungo e penso che sarà il futuro. Puoi fare lo stesso stile di query.

Sarebbe bello se questa libreria potrebbe essere esteso con le cose come | max e | to_vector per evitare nominare direttamente e copia il vettore, ma penso che come un linguaggio di query, in questo momento, è più che accettabile.

Problemi correlati