Подтвердить что ты не робот

Как использовать LINQ в С++/CLI - в VS 2010/.Net 4.0

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

4b9b3361

Ответ 1

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

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

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

Во-вторых, С++/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));
    }
}

Ответ 2

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

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

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

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

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