С# есть ли доступ foreach oneliner?

Я просто хочу знать, есть ли foreach oneliner в С#, например if oneliner (exp) ? then : else.

Ответ 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);
        }
    }
}

Ответ 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();
        }
    }

Однако для таких выражений вряд ли существует прецедент.