C#有foreach oneliner吗?

时间:2011-01-25 13:08:14

标签: c# syntax foreach

我只是想知道C#中是否有foreach一个衬垫,就像是一个衬垫(exp) ? then : else

6 个答案:

答案 0 :(得分:42)

如果您正在处理数组,那么您可以使用内置的静态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);
        }
    }
}

答案 1 :(得分:5)

答案 2 :(得分:4)

使用LINQ扩展方法可以实现

foreach行内容。例如:

而不是:

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

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

答案 3 :(得分:3)

想象一下,你有三个变量,并且你想只在一次中设置它们的相同属性:

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

相当于:

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

答案 4 :(得分:2)

当然,您可以使用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));

答案 5 :(得分:0)

if?运算符之间的主要区别在于if是一个语句,而?生成一个表达式。即你可以这样做:

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

但不是这样:

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

因此,如果你正在寻找像foreach表达式这样的东西,除了void之外没有可以自然返回的.NET类型,但是没有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();
    }
}

然而,这些表达几乎不存在任何用例。