Как использовать LINQ в C ++ / CLI - в VS 2010 / .Net 4.0 - PullRequest
30 голосов
/ 13 апреля 2011

Просто интересно, есть ли способ использовать LINQ в C ++ / CLI.Я нашел один пост, посвященный VS 2008 и требующий несколько обходных путей для класса System :: String.Я видел некоторые замены фреймворка в CodeProject, но мне было интересно, есть ли способ использовать его напрямую в C ++ / CLI.Если есть возможность, у кого-нибудь есть хороший пример?

Ответы [ 2 ]

42 голосов
/ 13 апреля 2011

Вы можете использовать методы Linq, которые определены в пространстве имен System::Linq, но вам придется перепрыгнуть через пару дополнительных обручей.

Во-первых, C ++ / CLI не поддерживает методы расширения. Однако методы расширения являются обычными методами, определенными для различных классов в System::Linq, поэтому вы можете вызывать их напрямую.

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

Во-вторых, C ++ / CLI не поддерживает лямбда-выражения. Единственный обходной путь - объявить фактический метод и передать его в качестве делегата.

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));
    }
}
0 голосов
/ 13 апреля 2011

Вы имеете в виду "Language Integrated Query" или пространство имен System::Linq?Каждый мой знакомый программист предпочитает синтаксис вызова функции вместо синтаксиса LINQ.

C ++ / CLI не поддерживает синтаксис LINQ.В прошлом базы данных поддерживали форму запросов с интегрированным языком, которая называлась Embedded SQL, которая в наши дни практически устарела.Внедрение SQL (а позднее и LINQ-to-SQL) было глупой идеей, с тех пор люди поняли, что логика запросов к базе данных должна находиться в базе данных, а не смешиваться с бизнес-логикой.

LINQ-to-объекты - более полезная идея, но синтаксис SQL просто неуместен.Поэтому программисты на C # склонны вызывать функции библиотеки LINQ напрямую.

C ++ на самом деле не нуждается в LINQ, потому что у нас есть шаблоны.Стандартные библиотечные алгоритмы, которые становятся возможными с помощью шаблонов, представляют собой расширенный набор преимуществ LINQ: они могут быть специализированы для конкретных контейнеров, но вы получаете хорошую реализацию по умолчанию без какой-либо помощи от класса контейнера.И они компилируются в гораздо более эффективный код, потому что разрешение перегрузки происходит после специализации (в отличие от универсальных).Хорошо, шаблоны не так хороши для отражения во время выполнения, как универсальные, но методы расширения C # тоже плохо работают с отражением во время выполнения.Самым большим недостатком стандартных алгоритмов C ++ была многословность написания функторов предикатов, но C ++ 0x вводит лямбда-выражения, которые позаботятся об этом.

Действительно, C ++ / CLI нужна версия стандартных алгоритмов, которыеработает на .NET контейнерах.И здесь это .Например, метод LINQ Where очень близко соответствует find_if.Теперь нам просто нужно, чтобы Microsoft поторопилась и реализовала окончательную спецификацию C ++ 0x.

...