C # есть ли доступный foreeliner? - PullRequest
15 голосов
/ 25 января 2011

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

Ответы [ 6 ]

42 голосов
/ 25 января 2011

Если вы имеете дело с массивом, то вы можете использовать встроенный статический 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);
        }
    }
}
5 голосов
/ 25 января 2011
4 голосов
/ 25 января 2011
Линейные лайнеры

foreach могут быть достигнуты с помощью методов расширения LINQ.Например:

вместо:

var result = new List<string>();
foreach (var item in someCollection)
{
    result.Add(item.Title);
}

Вы можете:

var result = someCollection.Select(x => x.Title).ToList();
3 голосов
/ 14 июня 2018

Представьте, что у вас есть три переменные, и вы хотите установить одно и то же свойство для них всего за один раз:

foreach (var item in new [] {labelA, labelB, labelC})
{
    item.Property= Value;
}

Это эквивалентно выполнению:

foreach (var item in new List<SomeType>(){labelA, labelB, labelC})
{
    item.Property= Value;
}
2 голосов
/ 25 января 2011

Конечно, вы можете использовать что-то вроде List<>.ForEach:

List<String> s = new List<string>();
s.Add("This");
s.Add("Is");
s.Add("Some");
s.Add("Data");
s.ForEach(_string => Console.WriteLine(_string));
0 голосов
/ 25 января 2011

Основное различие между if и оператором ? заключается в том, что if является оператором, а ? создает выражение. То есть Вы можете сделать это:

var _ = (exp) ? then : else; // ok

но не это:

var _ = if (exp) { then; } else { else; }; // error

Так что, если вы ищете что-то вроде выражения foreach, не существует типа .NET, который может естественным образом возвращаться, кроме void, но нет значений типа void, поэтому вы также можете просто написать:

foreach (var item in collection) process(item);

Во многих функциональных языках вместо void используется тип Unit, который имеет тип только с одним значением. Вы можете эмулировать это в .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();
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...