Мне нравится ответ Snowbear, если у вас на самом деле есть , чтобы сделать это ... но лично я бы по крайней мере попытался , чтобы избежать попадания в эту ситуацию.Например, даже сохраняя анонимных типов, я бы изменил ваш исходный код на:
bool large = true;
var result = new IEnumerable(); //This is wrong
List<int> numbers = new int[]{1,2,3,4,5,6,7,8,9,10}.ToList<int>();
Func<int, bool> predicate = large ? new Func<int, bool>(x => x > 5)
: x => x < 5;
var result = numbers.Where(predicate)
.Select(x => new { value = x });
foreach (var num in result)
{
Console.WriteLine(num.value);
}
Обратите внимание, как это убрало дублирование - понятно, что only вещь, на которую влияет large
, это предикат.
Я считаю, что код становится более понятным, если переменным присваивается только одно значение, в идеале в точке объявления.
Очевидно, это не такЭто всегда выполнимо, но стоит иметь в виду, где это возможно.Там, где это не возможно, ответ Snowbear хорош и гарантированно сработает.