Solo me pregunto si hay una manera de usar LINQ en C++/CLI. He encontrado un post que se centra en el VS 2008 y requiere un montón de soluciones para el Sistema::clase String. He visto algunos marco de reemplazos en CodeProject, pero me preguntaba si hay una manera de utilizar directamente en C++/CLI. Si se puede, alguien tiene un buen ejemplo?

InformationsquelleAutor pstrjds | 2011-04-13

2 Comentarios

  1. 42

    Puede utilizar los métodos de Linq que se definen en el System::Linq espacio de nombres, pero usted tendrá que saltar a través de un par extra de aros.

    Primera, C++/CLI no admite los métodos de extensión. Sin embargo, la extensión de los métodos habituales de los métodos definidos en diversas clases en System::Linq, así que usted puede llamar directamente a ellos.

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

    Segunda, C++/CLI no admite expresiones lambda. La única solución es declarar un método real, y de paso que como delegado.

    ref class Foo
    {
    public:
        static bool GreaterThanZero(int i) { return i > 0; }
    
        void Bar()
        {
            List<int>^ list = gcnew List<int>();
            int i = Enumerable::FirstOrDefault(list, gcnew Func<int, bool>(&Foo::GreaterThanZero));
        }
    }
    • Es posible el uso de C++11 lambda para GreaterThanZero función ?
  2. -1

    Estás hablando «Language Integrated Query» o la System::Linq espacio de nombres? Cada programador sé que prefiere la función de la sintaxis de la llamada en lugar de la sintaxis de LINQ.

    C++/CLI no admite la sintaxis de LINQ. Las bases de datos han apoyado de una forma de lenguaje integrado de consultas en el pasado, llamado SQL Incrustado, que está prácticamente muerta en estos días. SQL incrustado (y más tarde de LINQ to SQL) fue una idea tonta, para empezar, la gente se ha dado cuenta de que la base de datos de consulta de la lógica debe estar en la base de datos y no se mezcla con la lógica de negocio.

    LINQ to objects es una de las más útiles idea, pero la sintaxis de SQL sólo se siente fuera de lugar. Por lo tanto, C# programadores tienden a llamar a la LINQ funciones de la biblioteca directamente.

    C++ no necesita realmente LINQ, porque tenemos plantillas. El estándar de la biblioteca de algoritmos hecha posible por las plantillas son un superconjunto de las ventajas de LINQ: pueden ser especializados para determinados envases, pero usted consigue una buena implementación predeterminada sin ningún tipo de ayuda de la clase de contenedor. Y se compila para mucho más eficiente de código, debido a la sobrecarga de la resolución que sucede después de especialización (a diferencia de los genéricos). Ok, las plantillas no son tan buenos para el tiempo de ejecución de la reflexión, como los genéricos, pero en C# los métodos de extensión no juegan bien con el tiempo de ejecución de la reflexión, ya sea. El mayor inconveniente del estándar de C++ algoritmos ha sido el nivel de detalle de la escritura predicado functors, pero C++0x introduce las lambdas que tener cuidado de que.

    Realmente lo que C++/CLI necesidades es una versión de los algoritmos estándar que funciona en .NETO de los envases. Y aquí es. Por ejemplo, LINQ Where método corresponde muy de cerca a find_if. Ahora solo falta que Microsoft se de prisa y aplicar la final de C++0x spec.

    • Me refería a la sintaxis de la función. Yo tiendo a usar más a menudo. Yo sólo uso la sintaxis de LINQ cuando se me presenta la necesidad de hacer una complicada combinación.
    • Bien, probar la STL/CLR algoritmos. Ellos hacen la mayor parte de las mismas cosas LINQ hace, y utilizar el mismo estilo de los nativos de la biblioteca estándar de C++.
    • Yo probablemente en el futuro, lo que yo estaba tratando de duplicar fue una combinación compleja de LINQ funciones que hizo un amplio uso de las funciones lambda, en la final terminó más fácil descomponer el LINQ en algunos de los bucles y sentencias condicionales.
    • «Cada programador sé que prefiere la función de la sintaxis de la llamada en lugar de la sintaxis de LINQ.» Eres una persona con suerte.
    • ‘Idea tonta’, ‘Cada programador’ — un poco ineficiente declaraciones.
    • Citando a mí fuera de contexto es aún menos útil. Yo no he dicho que cada programador. Me dijo cada programador sé.
    • I CORAZÓN de LINQ + expresiones LAMBDA… muy interesante todo esto de verdad!

Dejar respuesta

Please enter your comment!
Please enter your name here