Best way to do this foreach with linq

Hey, I have this foreach loop that doesn't work 100%. I am basically outputting a string. My problem is that I do not want sb.Append (","); to add the last record to the loop. Is there an easy way to use linq to solve this problem?

 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("]");
+3
source share
8 answers

You must study String.Join()or String.Concat(). This greatly simplifies the creation of comma separated lists. And works great with 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));
+5
source

Not a Linq approach, but you can do this:

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("]");

Even with Linq, you will need to check whether you are in either the first or the last.

+1
source

normal ,

(int = 0; < lake.Reading.count; ++)

0

. ToArray() 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("]");
0

, 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 ,

0

.

  • .

  • "" bool, ,

    // Warning -- Air code fragment
    bool started = false;
    foreach (...) {
       if (!started)
          started = true;
       else
          sb.Append(",");
       // Rest of the loop
    }
  • StringBuilder, "" .
0

- :

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

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("]");
0
source

Source: https://habr.com/ru/post/1771899/


All Articles