2010-10-28 3 views
3

Hey là, J'ai cette boucle foreach qui ne fonctionne pas à 100%. Fondamentalement, je suis en train de sortir une chaîne. Mon problème est que je ne veux pas sb.Append (","); ajouter le dernier enregistrement de la boucle. Y at-il un moyen facile d'utiliser linq pour résoudre ce problème?meilleure façon de le faire foreach en utilisant 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("]"); 
+0

Est-ce que vous avez vraiment besoin de force d'utiliser LINQ, ou recherchez-vous simplement un moyen de concaténer ces chaînes avec des virgules entre eux qui fonctionne? –

Répondre

0

Vous pouvez utiliser comme normal pour boucle

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

+1

Il a demandé une expression LINQ – Novitzky

0

créer un tableau de lake.Reading avec le ToArray () méthode et changer le foreach en un. Il suffit de tester votre index par rapport au nombre d'éléments dans le tableau.

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

pas une approche LINQ, mais vous pouvez le faire:

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

Même avec Linq vous devez vérifier si vous êtes soit sur le premier élément ou le dernier.

5

Vous devriez regarder en utilisant String.Join() ou String.Concat(). Il rend les listes (séparées par des virgules) comme des chaînes beaucoup plus faciles. Et fonctionne bien avec 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)); 
0

Si vous voulez être concis, vous pouvez en fait utiliser linq. Mais événement si c'est une solution, ce n'est peut-être pas le meilleur. Quelque chose comme ça devrait fonctionner:

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

Mais string.join ferait l'affaire mieux que je pense

0

J'ai résolu ces trois façons.

  • Coupez la substance indésirable après la boucle.

  • Utilisez un "commencé" bool, par exemple,

 
    // Warning -- Air code fragment 
    bool started = false; 
    foreach (...) { 
     if (!started) 
      started = true; 
     else 
      sb.Append(","); 
     // Rest of the loop 
    } 
  • créé un wrapper pour StringBuilder qui fait le truc "a commencé".
0

Je généralement utiliser quelque chose comme:

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

Ce n'est pas vraiment LINQ qui fait la chose particulière que vous demandez, mais 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("]"); 
Questions connexes