преобразование выражений Linq/Lambda в анонимные методы

Обычно я получаю образцы кода, в которых используются лямбда-выражения. Я все еще использую .net 2.0, и мне сложно работать с таким кодом, например.

foreach(var item in items)
{
    var catCopy = item;
    foreach(var word in words)
    {
        var wordCopy = word;
        var waitCallback = new WaitCallback(state =>
        {
            DoSomething(wordCopy, catCopy);
        });

        ThreadPool.QueueUserWorkItem(waitCallback);
    }
}

как преобразовать такое выражение в любую из его альтернатив (т.е. не лямбда-код или анонимные методы)?

спасибо


person Smith    schedule 26.06.2011    source источник
comment
Я бы посоветовал потратить некоторое время и изучить лямбда-выражения, а не преобразовывать код.   -  person Magnus    schedule 26.06.2011
comment
@Magnus, это не будет работать в .net 2.0 или будет?   -  person Smith    schedule 26.06.2011
comment
Вы работаете с .Net в качестве разработчика или приложения должны быть развернуты там? Это важно, потому что Lambda и любая другая форма анонимных методов зависят от компилятора, а Linq — это .Net 3.5 и выше. Вы можете использовать компилятор 4.0 для целевой версии 2.0, что означает, что вы можете использовать Lambda. Этот фрагмент кода не содержит Linq.   -  person Dykam    schedule 26.06.2011
comment
В этом случае я бы добавил wordCopy и catCopy к объекту Pair (поскольку кортежа не существует) и использовал бы его как объект state для функции обратного вызова.   -  person Magnus    schedule 26.06.2011
comment
@Dykam Я разрабатываю таргетинг на .net 2 в некоторых случаях либо по запросу, либо, в основном, чтобы не ограничивать потребителя медленным интернет-соединением с большой загрузкой. Как я могу использовать компилятор .net 4 для таргетинга на .net 2 и при этом использовать лямбда?   -  person Smith    schedule 26.06.2011
comment
Перейдите в настройки проекта, щелкнув правой кнопкой мыши проект -> свойства. Существует настройка для установки целевой платформы. Я думаю, что есть еще один для установки целевого компилятора, но по умолчанию он равен 4.0. Это только при использовании Visual Studio 10.   -  person Dykam    schedule 26.06.2011
comment
@Dykam использую vs2008, мне все еще нужно знать, как настроить таргетинг на .n2, но работать с .net 4!   -  person Smith    schedule 26.06.2011
comment
Ну, тогда это невозможно, так как компилятор может работать с несколькими фреймворками, начиная с VS2010/.Net4.0/C#4.   -  person Dykam    schedule 26.06.2011


Ответы (2)


Лямбда-выражение в C# — это просто делегат. Учитывая, что вы используете .Net 2.0, вы можете использовать анонимные методы для определения делегата на лету, поэтому замените строку кода на:

var waitCallback = new WaitCallback(
                        delegate(object state) { 
                             DoSomething(workCopy, catCopy); 
                        });
person Swanny    schedule 26.06.2011
comment
Конечно, обычно объявленный параметр (состояние) используется где-то в функции. - person Swanny; 26.06.2011
comment
Хотя это не решение моей проблемы, я все равно должен принять ответ - person Smith; 26.06.2011

Почему вы все еще используете .Net 2? Вы упускаете много замечательных изменений, особенно LINQ.

При этом лямбда-выражения не являются функцией .Net 3.5, они являются функцией C# 3.0, и вы можете использовать их при компиляции для .Net 2.0, если вам это действительно нужно.

person svick    schedule 26.06.2011
comment
как я могу разрабатывать в .net 2 и использовать лямбда, есть ли ссылка? - person Smith; 26.06.2011
comment
@Smith, вы должны использовать Visual Studio, которая его поддерживает (2008 или 2010), и выбрать целевую платформу в свойствах проекта. См. MSDN. - person svick; 26.06.2011