【问题标题】:C# is there a foreach oneliner available?C# 是否有可用的 foreach oneliner?
【发布时间】:2011-01-25 13:08:13
【问题描述】:

我只想知道C#中是否有foreach oneliner,比如if oneliner (<em>exp</em>) ? <em>then</em> : <em>else</em>

【问题讨论】:

  • 我想我的回答直指你想要的!
  • 我不知道这是否是 OP 想要的,但 @sergiol 有我想要的。一种为 foreach 提供一组仅使用一次的文字的方法。

标签: c# syntax foreach


【解决方案1】:

如果你正在处理一个数组,那么你可以使用内置的静态ForEach 方法:

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

如果您处理的是List&lt;T&gt;,那么您可以使用内置的ForEach 实例方法:

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

没有任何内置功能可以对抗任意的IEnumerable&lt;T&gt; 序列,但如果您觉得需要,可以轻松推出自己的扩展方法:

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

【讨论】:

【解决方案2】:

【讨论】:

    【解决方案3】:

    foreach line-liners 可以通过 LINQ 扩展方法来实现。例如:

    代替:

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

    你可以:

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

    【讨论】:

      【解决方案4】:

      假设您有三个变量,并且您想一次性设置它们的相同属性:

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

      相当于做:

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

      【讨论】:

        【解决方案5】:

        当然,你可以使用List&lt;&gt;.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));
        

        【讨论】:

          【解决方案6】:

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

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

          然而,此类表达式几乎不存在任何用例。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-28
            • 1970-01-01
            • 1970-01-01
            • 2016-01-15
            • 2022-01-20
            • 2016-11-20
            相关资源
            最近更新 更多