【发布时间】: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
只是想知道是否有办法在 C++/CLI 中使用 LINQ。我发现了一篇专注于 VS 2008 的帖子,并且需要一系列针对 System::String 类的解决方法。我在 CodeProject 上看到了一些框架替换,但我想知道是否有办法直接在 C++/CLI 中使用它。如果可以的话,谁有一个很好的例子?
【问题讨论】:
标签: linq visual-studio-2010 .net-4.0 c++-cli
您可以使用在 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 吗?
您是在谈论“语言集成查询”还是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 规范。
【讨论】: