Wowa
Wowa

Reputation: 1811

C# is there a foreach oneliner available?

I just want to know if there is a foreach oneliner in C#, like the if oneliner (exp) ? then : else.

Upvotes: 28

Views: 70141

Answers (6)

Moo-Juice
Moo-Juice

Reputation: 38820

Sure, you can use something like 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));

Upvotes: 4

Konstantin Oznobihin
Konstantin Oznobihin

Reputation: 5327

The primary difference between if and the ?operator is that if is a statement, while ? produces an expression. I.e. you can do this:

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

but not this:

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

So if you are looking for something like a foreach expression, there is no .NET type that can naturally return except for void, but there are no values of void type, so you can equally just write:

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

In many functional languages, a Unit type is used instead of void which is a type with only one value. You can emulate this in .NET and create your own foreach expression:

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();
    }
}

However there hardly exists any use-case for such expressions.

Upvotes: 1

sergiol
sergiol

Reputation: 4335

Imagine you have three variables and you want to set the same property of them all in only one go:

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

It is the equivalent of doing:

foreach (var item in new List<SomeType>(){labelA, labelB, labelC})
{
    item.Property= Value;
}

Upvotes: 9

LukeH
LukeH

Reputation: 269558

If you're dealing with an array then you can use the built-in static ForEach method:

Array.ForEach(yourArray, x => Console.WriteLine(x));

If you're dealing with a List<T> then you can use the built-in ForEach instance method:

yourList.ForEach(x => Console.WriteLine(x));

There's nothing built-in that'll work against any arbitrary IEnumerable<T> sequence, but it's easy enough to roll your own extension method if you feel that you need it:

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);
        }
    }
}

Upvotes: 77

Darin Dimitrov
Darin Dimitrov

Reputation: 1039298

foreach line-liners could be achieved with LINQ extension methods. For example:

instead of:

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

you could:

var result = someCollection.Select(x => x.Title).ToList();

Upvotes: 8

Denis Palnitsky
Denis Palnitsky

Reputation: 18387

List.ForEach Method

Upvotes: 6

Related Questions