Cómo usar LINQ en C ++ / CLI – en VS 2010 / .Net 4.0

Solo me pregunto si hay una forma de usar LINQ en C ++ / CLI. Encontré una publicación que se centró en VS 2008 y requirió un montón de soluciones para la clase System :: String. He visto algunos reemplazos de framework en CodeProject, pero me preguntaba si hay una forma de usarlo directamente en C ++ / CLI. Si puedes, ¿alguien tiene un buen ejemplo?

Puede utilizar los métodos de Linq que están definidos en el espacio de nombres de System::Linq , pero deberá pasar por un par de aros adicionales.

En primer lugar, C ++ / CLI no es compatible con los métodos de extensión. Sin embargo, los métodos de extensión son métodos regulares definidos en varias clases en System::Linq , por lo que puede llamarlos directamente.

 List^ list = gcnew List(); int i = Enumerable::FirstOrDefault(list); 

En segundo lugar, C ++ / CLI no admite expresiones lambda. La única solución es declarar un método real y pasarlo como un delegado.

 ref class Foo { public: static bool GreaterThanZero(int i) { return i > 0; } void Bar() { List^ list = gcnew List(); int i = Enumerable::FirstOrDefault(list, gcnew Func(&Foo::GreaterThanZero)); } } 

¿Estás hablando de “Language Integrated Query” o del espacio de nombres System::Linq ? Cada progtwigdor que conozco prefiere la syntax de llamada de función en lugar de la syntax de LINQ.

C ++ / CLI no admite la syntax de LINQ. Las bases de datos han soportado una forma de consulta integrada al lenguaje en el pasado, llamada Embedded SQL, que está prácticamente muerta en estos días. El SQL incrustado (y más tarde LINQ-to-SQL) fue una idea tonta para empezar, las personas ya han descubierto que la lógica de consulta de la base de datos debe estar en la base de datos y no mezclarse en la lógica de negocios.

LINQ-to-objects es una idea más útil, pero la syntax SQL simplemente se siente fuera de lugar. Entonces los progtwigdores de C # tienden a llamar a las funciones de la biblioteca LINQ directamente.

C ++ realmente no necesita LINQ, porque tenemos plantillas. Los algoritmos de la biblioteca estándar que las plantillas hacen posible son un superconjunto de las ventajas de LINQ: pueden especializarse para contenedores particulares, pero se obtiene una buena implementación predeterminada sin ayuda de la clase contenedora. Y comstackn a un código mucho más eficiente, porque la resolución de sobrecarga ocurre después de la especialización (a diferencia de los generics). Ok, las plantillas no son tan buenas para la reflexión en tiempo de ejecución como los generics, pero los métodos de extensión C # tampoco funcionan bien con la reflexión en tiempo de ejecución. El mayor inconveniente de los algoritmos estándar de C ++ ha sido la verbosidad de escribir funtores de predicados, pero C ++ 0x presenta lambdas que se encargan de eso.

Realmente, lo que necesita C ++ / CLI es una versión de los algoritmos estándar que funciona en contenedores .NET. Y aquí está . Por ejemplo, el método Where de LINQ se corresponde bastante con find_if . Ahora solo necesitamos que Microsoft se apure e implemente la especificación final de C ++ 0x.