我只是想知道C#中是否有foreach一个衬垫,就像是一个衬垫(exp) ? then : else
。
答案 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)
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();
}
}
然而,这些表达几乎不存在任何用例。