Народ,
конечно ежу понятно, что понятнее
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'
в последнем примере
item => doSomething(item)
равнозначен простому doSomething — так что самый последний пример не совсем удачный.
Т.е. вопрос в том, как записать всё одним выражением в ситуации, когда нужно обратиться к свойствам item, например
item => item.someProperty = someValue
и при этом не указывать явно тип этого item (чтобы компилятор вывел его из типов item1, item2, item3, как во втором примере)?
Здравствуйте, 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
Здравствуйте, svmich, Вы писали:
S>но как можно было бы (пусть тоже не слишком наглядно) сделать всё в одном выражении, сохранив возможность выведения компилятором типа аргумента у метода doSomething, чтобы не указывать этот тип явно?
А компилятор сменить не пробовали?