web-dev-qa-db-fra.com

Existe-t-il une bibliothèque LINQ pour C ++?

Existe-t-il des mouvements agnostiques de la plate-forme (pas CLI) pour que LINQ passe au C++ d'une manière ou d'une autre?

Je veux dire qu'une grande partie des frameworks de serveurs dans le monde fonctionnent sur des versions d'UNIX et avoir accès à LINQ pour C++ sur UNIX rendrait probablement beaucoup de gens heureux!

78
Robert Gould

Linq ++ par Hong Jiang ressemble à un bon début. Sa syntaxe est beaucoup plus proche de Linq que de CLinq. Linq par pfultz2 semble également intéressant, mais il a besoin d'un compilateur C++ 11.

34
js.

Microsoft a vient d'annoncer qu'ils ont construit LINQ pour C et C++. Pas encore disponible, cependant.

Mise à jour 11/06/2012:

Microsoft Open Technologies, Inc. a maintenant publié et open-source (Apache License 2.0) un certain nombre de bibliothèques connexes, y compris une implémentation LINQ (Ix ++), et c'est nouveau réactif Bibliothèque d'extensions (Rx ++).

18
David Cuccia

Ceci est ma solution de modèle de bibliothèque C++ LINQ.
Le code source est ici: Boolinq
Il existe de nombreux tests sur chaque fonctionnalité.
J'y travaille en ce moment.

Des commentaires?
Peut-être des conseils?

MISE À JOUR: le projet a été déplacé vers https://github.com/k06a/boolinq et a maintenant la version 2.0 avec seulement 700 lignes de code source :)

15
k06a

http://cpplinq.codeplex.com/ est une très bonne implémentation.
De l'auteur:
La motivation de CppLinq est que boolinq et Native-RX semblent être basés autour de l'opérateur "." pour composer des fonctions de liste. Le problème est que le "." L'opérateur est qu'il ne peut pas être surchargé en C++, ce qui rend difficile l'extension de ces bibliothèques avec des fonctions de ma propre conception. Pour moi, c'est important. CppLinq est basé sur l'opérateur >> qui est surchargeable, donc CppLinq peut être rendu extensible.

8
yufanyufan

Vous pouvez jeter un œil à PSade.Oven , une bibliothèque fortement boostée travaillant sur les plages STL et fournissant de nombreuses fonctions de type LINQ.

7
zwvista

J'ai écrit une petite bibliothèque cppLinq qui réimplémente IEnumerable <> et ses opérateurs LINQ. Ce n'est qu'une expérience; pour l'instant, cela ne fonctionne que sur Windows (les coroutines sont implémentées avec des fibres Win32), et ne se construit qu'avec l'aperçu Dev de VS11 (il fait un usage intensif des expressions lambda :-)).

Il permet d'écrire du code comme ceci:

auto source = IEnumerable<int>::Range(0, 10);

auto it = source->Where([](int val) { return ((val % 2) == 0); })
                ->Select<double>([](int val) -> double { return (val * val); }));

foreach<double>(it, [](double& val){
    printf("%.2f\n", val);
});
7
Paolo Severini

Voici un autre alternative qui est simplement un wrapper autour des algorithmes boost et stl, et ainsi vous obtenez la plupart des avantages de performance de ces implémentations.

Cela fonctionne comme ceci:

std::vector<int> xs;
auto count = from(xs)
   .select([](int x){return x*x;})
   .where([](int x){return x > 16;})
   .count();
auto xs2 = from(xs)
   .select([](int x){return x*x;})
   .to<std::vector<int>>();

Notez que certaines méthodes renvoient un proxy pour les plages vides, par exemple.

std::vector<int> xs;
auto max = from(xs)
   .select([](int x){return x*x;})
   .where([](int x){return x > 16;})
   .max()
   .value_or(default_max_value);

Vos commentaires sont les bienvenus.

3
ronag

En fait, si vous souhaitez simplement utiliser Linq pour la compréhension de la liste, vous pouvez utiliser cette bibliothèque Linq . Il nécessite C++ 11 (il fonctionnera cependant dans MSVC 2010) et Boost. Avec la bibliothèque, vous pouvez écrire des requêtes linq comme ceci:

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);
}

Qui produira:

Omelchenko score: 97
O'Donnell score: 91
Mortensen score: 94
Garcia score: 97
Beebe score: 91
3
Paul Fultz II

Voici mon implémentation de c ++ - linq avec c ++ 11 (en chinois):

http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html

Il prend en charge des fonctionnalités telles que "requête différée", "basée sur la pile" (utilisez un opérateur nouveau le moins possible), "copie sémantique" (afin que vous puissiez itérer une requête multitime après l'avoir sauvegardée), etc.

Il prend également en charge des dizaines de fonctions, dont "from, select, where, cast, range, all, any, cast, average, contain, count, first, last, head, tail, groupBy, takeUntil, skipUntil, max, min, reduction, unique, sort, random, intersect, _union ".

Je pense que mon code est assez simple pour être compris et étendu par n'importe qui.

2
Scan

C++ 0x, ou quoi qu'il finisse par être appelé, a un nouveau mot clé appelé auto qui permet l'inférence de type. Et oui, il y aura des lambda à venir pour C++. En outre, une recherche rapide Google a révélé cela, CLinq .

2
Chris