【问题标题】:How to use LINQ in C++/CLI - in VS 2010/.Net 4.0如何在 C++/CLI 中使用 LINQ - 在 VS 2010/.Net 4.0 中
【发布时间】:2011-04-13 02:23:21
【问题描述】:

只是想知道是否有办法在 C++/CLI 中使用 LINQ。我发现了一篇专注于 VS 2008 的帖子,并且需要一系列针对 System::String 类的解决方法。我在 CodeProject 上看到了一些框架替换,但我想知道是否有办法直接在 C++/CLI 中使用它。如果可以的话,谁有一个很好的例子?

【问题讨论】:

    标签: linq visual-studio-2010 .net-4.0 c++-cli


    【解决方案1】:

    您可以使用在 System::Linq 命名空间中定义的 Linq 方法,但您必须跳过几个额外的环节。

    首先,C++/CLI 不支持扩展方法。但是扩展方法是在System::Linq中的各个类上定义的常规方法,所以可以直接调用。

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

    其次,C++/CLI 不支持 lambda 表达式。唯一的解决方法是声明一个实际方法,并将其作为委托传递。

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

    【讨论】:

    • GreaterThanZero 函数可以使用 C++11 lambda 吗?
    • 能否扩展为静态 bool GreaterThanX(int i, int x) { return i > x; }
    【解决方案2】:

    您是在谈论“语言集成查询”还是System::Linq 命名空间?我认识的每个程序员都更喜欢函数调用语法而不是 LINQ 语法。

    C++/CLI 不支持 LINQ 语法。过去,数据库支持一种语言集成查询形式,称为嵌入式 SQL,如今它几乎已死。嵌入式 SQL(以及后来的 LINQ-to-SQL)一开始是一个愚蠢的想法,人们后来发现数据库查询逻辑应该在数据库中,而不是混入业务逻辑中。

    LINQ-to-objects 是一个更有用的想法,但 SQL 语法感觉不合适。所以 C# 程序员倾向于直接调用 LINQ 库函数。

    C++ 并不真正需要 LINQ,因为我们有模板。由模板实现的标准库算法是 LINQ 优势的超集:它们可以专门用于特定容器,但是您可以在没有容器类的任何帮助的情况下获得良好的默认实现。它们编译成更高效的代码,因为重载决议发生在特化之后(与泛型不同)。好的,模板在运行时反射方面不如泛型好,但 C# 扩展方法也不能很好地与运行时反射配合使用。 C++ 标准算法的最大缺点是编写谓词函子很冗长,但 C++0x 引入了 lambdas 来解决这个问题。

    C++/CLI 真正需要的是适用于 .NET 容器的标准算法版本。和here it is。例如,LINQ 的Where 方法与find_if 非常接近。现在我们只需要微软快点实现最终的 C++0x 规范。

    【讨论】:

    • 我的意思是函数语法。我倾向于更频繁地使用它。当我最终需要进行复杂的连接时,我只使用 LINQ 语法。
    • “我认识的每个程序员都喜欢函数调用语法而不是 LINQ 语法。”你是个幸运的人。
    • '愚蠢的想法','每个程序员'——有些无益的陈述。
    • @Oleg:断章取义地引用我的话就更没用了。我没有说每个程序员。我说我认识的每个程序员
    • I HEART LINQ + LAMBDA 表达式...确实很酷的东西!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多