C#: избитый forEach для IEnumerable
От: svmich Россия  
Дата: 20.09.12 12:47
Оценка:
Народ,

конечно ежу понятно, что понятнее

void someMethod()
{
    foreach(var item in new[] { item1, item2, item3 })
    {
        doSomething(item);
    }
}


чем пресловутое

void forEach<T>(Action<T> action, params T[] items)
{
    foreach(var item in items)
    {
        action(item);
    }
}

void someMethod()
{
    forEach(doSomething, item1, item2, item3);
}


но как можно было бы (пусть тоже не слишком наглядно) сделать всё в одном выражении, сохранив возможность выведения компилятором типа аргумента у метода doSomething, чтобы не указывать этот тип явно?

Т.е. избежать явного указания item_type и, по возможности, сохранить раннее связывание, по сравнению с таким способом:
void someMethod()
{
    new Action<item_type>(item => doSomething(item)).DynamicInvoke(item1, item2, item3);
}


Есть варианты?

21.09.12 11:17: Перенесено из '.NET'
Re: C#: избитый forEach для IEnumerable
От: svmich Россия  
Дата: 20.09.12 13:25
Оценка:
в последнем примере
item => doSomething(item)

равнозначен простому doSomething — так что самый последний пример не совсем удачный.

Т.е. вопрос в том, как записать всё одним выражением в ситуации, когда нужно обратиться к свойствам item, например
item => item.someProperty = someValue

и при этом не указывать явно тип этого item (чтобы компилятор вывел его из типов item1, item2, item3, как во втором примере)?
Re: C#: избитый forEach для IEnumerable
От: Sinix  
Дата: 20.09.12 13:30
Оценка:
Здравствуйте, svmich, Вы писали:


S>конечно ежу понятно, что понятнее

new[] { 1, 2, 3 }.ForEach(i => Console.WriteLine(i));


S>Есть варианты?

Не использовать лямбды для кода с побочными эффектами и ограничиться обычным foreach.

Как всегда, для чтения на ночь:
http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx
Re: C#: избитый forEach для IEnumerable
От: hardcase Пират http://nemerle.org
Дата: 20.09.12 14:41
Оценка: -1
Здравствуйте, svmich, Вы писали:

S>но как можно было бы (пусть тоже не слишком наглядно) сделать всё в одном выражении, сохранив возможность выведения компилятором типа аргумента у метода doSomething, чтобы не указывать этот тип явно?


А компилятор сменить не пробовали?
/* иЗвиНите зА неРовнЫй поЧерК */
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.