LINQ untuk pemahaman daftar di C ++, menyediakan implementasi LINQ untuk C ++. Saat ini hanya mendukung rentang C ++, tetapi mendukung metode ekstensi dan kueri untuk LINQ. Inilah contohnya:
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 ) ;
}Kode C ++ di atas akan menghasilkan ini (ya yaitu kode C ++ di atas):
Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
Ekstensi diimplementasikan menggunakan | operator pipa. Ini memungkinkan mereka untuk diterapkan pada rentang apa pun, tanpa memerlukan warisan dari beberapa kelas dasar khusus. Jadi ekstensi dapat bekerja seperti ini:
vector< int > numbers = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 };
auto r = numbers
| linq::where([]( int x) { return x > 2 ; })
| linq::select([]( int x) { return x * x; });Metode ekstensi yang didukung adalah:
Perpustakaan juga menyediakan kelas range_extension , yang dapat digunakan untuk menulis ekstensi Anda sendiri juga. Pertama cukup tentukan fungsi sebagai kelas objek fungsi, seperti ini:
struct contains_t
{
template < class Range , class T >
bool operator ()(Range && r, T && x) const
{ return (r | linq::find (x)) != boost::end (r); };
};Kemudian inisialisasi ekstensi menggunakan inisialisasi statis:
range_extension< contains_t > contains = {};Maka ekstensi dapat digunakan seperti ini:
if (numbers | contains( 5 )) printf( " We have a 5 " ); Semua kueri LINQ harus dimulai dengan pernyataan from . Ini menentukan nama variabel yang akan digunakan untuk lambdas dan wadah yang akan diterapkan kueri. Juga, beberapa from pernyataan dapat digunakan.
struct student
{
std :: string name ;
std :: vector < int > grades ;
student ( ) { }
template < class Range >
student ( std :: string name , Range && r )
: name ( name ) , grades ( boost :: begin ( r ) , boost :: end ( r ) )
{ }
} ;
std :: vector < student > students =
{
student ( "Bob" , { 90 , 100 , 75 } )
student ( "Tom" , { 92 , 81 , 70 } )
student ( "Terry" , { 105 , 98 , 94 } )
} ;
// { 90, 100, 75, 92, 81, 70, 105, 98, 94 }
auto q = LINQ ( from ( s , students ) from ( g , s . grades ) select ( g ) ) ; Klausa di mana mengembalikan elemen yang cocok dengan predikat. Ini opsional tetapi harus datang setelah klausa from klausa dan harus sebelum klausa select jika ada satu.
vector < int > v = { 1 , 3 , 4 , 5 } ;
// { 1, 3, 5 }
auto q = LINQ ( from ( i , v ) where ( i % 2 ) ) ;Klausa pilih menerapkan transformasi ke elemen. Ini juga opsional, tetapi harus menjadi klausa terakhir.
std :: vector < int > v = { 1 , 2 , 4 } ;
// { 3, 6, 24 }
auto q = LINQ ( from ( x , v ) select ( x * 3 ) ) ; Klausa orderby memungkinkan Anda menentukan elemen untuk memesan rentang oleh. Juga ascending atau descending dapat didahului oleh pemilih untuk menentukan arah pemesanan. Standarnya adalah naik.
struct person
{
std :: string name ;
int age ;
person ( ) { }
person ( std :: string name , int age )
: name ( name ) , age ( age )
{ }
} ;
std :: vector < person > people =
{
person ( "Tom" , 25 ) ,
person ( "Bob" , 22 ) ,
person ( "Terry" , 37 ) ,
person ( "Jerry" , 22 )
}
// { "Jerry", "Bob", "Tom", "Terry" }
auto q = LINQ ( from ( p , people ) orderby ( p . age , descending p . name ) select ( p . name ) ) ; Klausa group mengelompokkan unsur -unsur suatu urutan. Parameter pertama adalah pemilih kunci, dan yang kedua adalah pemilih nilai.
struct person
{
std :: string name ;
int age ;
person ( ) { }
person ( std :: string name , int age )
: name ( name ) , age ( age )
{ }
} ;
std :: vector < person > people =
{
person ( "Tom" , 25 ) ,
person ( "Bob" , 22 ) ,
person ( "Terry" , 37 ) ,
person ( "Jerry" , 22 )
}
auto q = LINQ ( from ( p , people ) group ( p . age , p . name ) ) ; Linq dapat dengan mudah diinstal dengan CGET:
cget install pfultz2/Linq
Ini akan menginstal ketergantungan Boost secara otomatis. Perpustakaan juga dapat diinstal secara manual dengan CMake.
find_package(Linq) juga tersedia untuk mengkonsumsi linq dari cmake:
find_package(Linq)
target_linkq_libraries(yourLib linq::linq)
Untuk dukungan penuh itu membutuhkan dentang atau GCC, dan meningkatkan. Ada dukungan parsial untuk Visual Studio. Visual Studio tidak mendukung default_if_empty , group_by , group_join , join , order_by , select_many , dan then_by ekstensi, dan itu tidak mendukung orderby , group , dan bersarang dari klausa. Mungkin beberapa penyihir studio visual dapat membantu menemukan solusi untuk bug MSVC.
Banyak from pernyataan diterapkan menggunakan lambdas bersarang. Namun, karena bug di MSVC 2010, lambas bersarang tidak berfungsi (ini harus diperbaiki di MSVC 2012, tetapi saya belum mengujinya). Jika ada cara untuk mengimplementasikan pengidentifikasi transparan di C ++, lambdas bersarang dapat dihindari.
Juga, klausa let , dan join belum didukung. Klausa into tidak dapat didukung tanpa bantuan lambdas polimorhpic.
BSL-1.0