Я просто хочу знать, есть ли foreach oneliner в С#, например if oneliner (exp) ? then : else
.
С# есть ли доступ foreach oneliner?
Ответ 1
Если вы имеете дело с массивом, вы можете использовать встроенный статический метод ForEach
:
Array.ForEach(yourArray, x => Console.WriteLine(x));
Если вы имеете дело с List<T>
, вы можете использовать встроенный метод ForEach
:
yourList.ForEach(x => Console.WriteLine(x));
Нет ничего встроенного, который будет работать против любой произвольной последовательности IEnumerable<T>
, но достаточно просто перевернуть свой собственный метод расширения, если вы считаете, что вам это нужно:
yourSequence.ForEach(x => Console.WriteLine(x));
// ...
public static class EnumerableExtensions
{
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action)
{
if (source == null) throw new ArgumentNullException("source");
if (action == null) throw new ArgumentNullException("action");
foreach (T item in source)
{
action(item);
}
}
}
Ответ 2
Ответ 3
foreach
линейные лайнеры могут быть достигнуты с помощью методов расширения LINQ. Например:
вместо:
var result = new List<string>();
foreach (var item in someCollection)
{
result.Add(item.Title);
}
вы можете:
var result = someCollection.Select(x => x.Title).ToList();
Ответ 4
Конечно, вы можете использовать что-то вроде List<>::ForEach
:
List<String> s = new List<string>();
s.Add("These");
s.Add("Is");
s.Add("Some");
s.Add("Data");
s.ForEach(_string => Console.WriteLine(_string));
Ответ 5
Основное различие между if и operator? что если это утверждение в то время как "?" выдает выражение. То есть вы не можете этого сделать:
var _ = (exp) ? then : else; // ok
но не это:
var _ = if (exp) { then; } else { else; }; // error
Итак, если вы ищете что-то вроде выражения foreach, нет типа .NET, он может естественно возвращаться за исключением void, но нет значений типа void, поэтому вы можете в равной степени просто написать:
foreach (var item in collection) process(item);
Во многих функциональных языках используется тип Unit вместо void, который имеет тип только с одним значением. Вы можете эмулировать это в .NET и создать собственное выражение foreach:
class Unit
{
public override bool Equals(object obj)
{
return true;
}
public override int GetHashCode()
{
return 0;
}
}
public static class EnumerableEx
{
public static Unit ForEach<TSource>(
this IEnumerable<TSource> source,
Action<TSource> action)
{
foreach (var item in source)
{
action(item);
}
return new Unit();
}
}
Однако для таких выражений вряд ли существует прецедент.