【问题标题】:better way to do this foreach using linq使用 linq 执行此操作的更好方法
【发布时间】:2010-10-28 10:08:02
【问题描述】:

你好, 我有这个不能 100% 工作的 foreach 循环。基本上我正在输出一个字符串。我的问题是我不想要 sb.Append(",");被添加到循环中的最后一条记录。有没有简单的方法使用 linq 来解决这个问题?

 sb.Append("Readings:[");
                    foreach (var reading in lake.Reading)
                    {
                        sb.Append("[");
                        sb.Append("\"");
                        sb.Append(reading.DateTime.ToString("dd-MMM-yy"));
                        sb.Append("\"");
                        sb.Append(",");
                        sb.Append(reading.Level);
                        sb.Append("]");
                //only insert this line if its the not the last record        sb.Append(",");
                    }
                sb.Append("]");

【问题讨论】:

  • 您真的需要强制使用 LINQ,还是只是在寻找一种将这些字符串与 Works™ 之间的逗号连接起来的方法?

标签: c# linq


【解决方案1】:

您应该考虑使用String.Join()String.Concat()。它使得将(逗号分隔的)列表制作为字符串变得更加容易。并且可以很好地与 LINQ 配合使用。

var combine = from r in lake.Reading
              select String.Format("[\"{0:dd-MMM-yy}\",{1}]", r.DateTime, r.Level);
var str = String.Format("Readings:[{0}]", String.Join(",", combine));

【讨论】:

    【解决方案2】:

    不是 Linq 方法,但您可以这样做:

    sb.Append("Readings:[");
    
    bool isFirst = true;
    foreach (var reading in lake.Reading)
    {
        if( isFirst == false )
        {
            sb.Append( "," );
        }
        isFirst = false;
    
        sb.Append("[");
        sb.Append("\"");
        sb.Append(reading.DateTime.ToString("dd-MMM-yy"));
        sb.Append("\"");
        sb.Append(",");
        sb.Append(reading.Level);
        sb.Append("]");
    }
    sb.Append("]");
    

    即使使用 Linq,您也需要检查您是在第一项还是在最后一项。

    【讨论】:

      【解决方案3】:

      你可以像普通的for循环一样使用

      for(int i=0;i

      【讨论】:

      • 他要求一个 LINQ 表达式
      【解决方案4】:

      使用 ToArray() 方法创建一个数组到 lake.Reading 并将 foreach 更改为 for。只需根据数组中元素的数量测试您的索引。

      sb.Append("Readings:[");
      Array list = late.Reading.ToArray();
                      for (int i=0;i<list.Length;i++)
                      {
                          var reading = list[i];
                          sb.Append("[");
                          sb.Append("\"");
                          sb.Append(reading.DateTime.ToString("dd-MMM-yy"));
                          sb.Append("\"");
                          sb.Append(",");
                          sb.Append(reading.Level);
                          sb.Append("]");
                          if (i!=list.Length-1)
                             sb.Append(",");
                      }
                  sb.Append("]");
      

      【讨论】:

        【解决方案5】:

        如果你想要简洁,你实际上可以使用 linq。但是如果它是一个解决方案,它可能不是最好的。类似的东西应该可以工作:

        lake.Reading.Aggregate(new StringBuilder(),
          (acc, value) => { return acc.AppendFormat("[{0},{1}],",value.Reading,value.Level); },
           acc => acc.Length > 1 ? (acc.Remove(acc.Length-1, 1).ToString()):string.Empty
          );
        

        但我认为 string.Join 会做得更好

        【讨论】:

          【解决方案6】:

          这三种方法我都解决了。

          • 在循环之后修剪不需要的东西。

          • 使用“开始”布尔值,例如,

          // 警告 -- 空气代码片段 布尔开始 = 假; foreach (...) { 如果(!开始) 开始=真; 别的 sb.Append(","); // 循环的其余部分 }
          • 为执行“启动”技巧的 StringBuilder 创建了一个包装器。

          【讨论】:

            【解决方案7】:

            我通常使用类似的东西:

            string s = lake.Reading
                .Select(r => "[\"" + r.DateTime.ToString("dd-MMM-yy") + "\"," + r.Level + "]")
                .Aggregate((n, m) => n + "," + m);
            

            【讨论】:

              【解决方案8】:

              执行您要求的特定事情的并不是真正的 LINQ,而是 string.Join

              var formattedReadings = 
                  from reading in lake.Reading
                  select string.Format("[\"{0}\",{1}]", 
                      reading.DateTime.ToString("dd-MMM-yy"), 
                      reading.Level);
              
              sb.Append("Readings:[");
              sb.Append(string.Join(",", formattedReadings));
              sb.Append("]");
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-07-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-25
                • 1970-01-01
                • 1970-01-01
                • 2013-01-29
                相关资源
                最近更新 更多