2011-01-17 1 views
2

J'ai le code suivant:Est-il possible de déterminer la position actuelle lors de l'itération d'une ICollection?

foreach(string reelid in unValidatedFeedersOnMachine.Keys) 
{ 
    _sqlString.Append("CompID = '").Append(reelid).Append("' "); 
} 

Je dois ajouter dans cette boucle à chaque itération .Appened("or ") sauf le dernier.

Une idée comment je peux savoir quand je me suis situé sur la dernière itération ici?

+0

Note mineure; si chaque clé ('reelid') est connue pour être une valeur sûre (à partir de données de configuration privées, etc.) alors cela peut être correct - mais ** n'utilisez pas ** la concaténation s'il y a * une chance * qu'un utilisateur puisse les influencer - peut-être en éditant le code HTML d'un formulaire. Sinon, il s'agit d'un risque d'attaque par injection SQL. –

+0

@ Marc Gravell: Ces valeurs proviennent de la machine automatique, aucune chance que quelqu'un puisse influencer les valeurs. –

Répondre

5

je le ferais dans l'autre sens - le traitement de la première que l'exception est plus simple :

bool first = true; 
foreach(string reelid in unValidatedFeedersOnMachine.Keys) 
{ 
    if(first) {first = false;} 
    else {_sqlString.Append(" or ";} 
    _sqlString.Append("CompID = '").Append(reelid).Append("' "); 
} 

ou .NET 4.0 il suffit d'utiliser:

string s = string.Join(" or ", 
      from key in unValidatedFeedersOnMachine.Keys 
      select "CompID = '" + reelid + "'"); 

ou encore mieux, si cela est SQL - passer à IN ...

string s = "CompID IN (" + string.Join("," 
      from key in unValidatedFeedersOnMachine.Keys 
      select "'" + reelid + "'") + ")"; 
+0

(notez que je suppose dans ce qui précède que le 'reelid' est injectable - c'est-à-dire qu'il provient d'une source de confiance, cela peut être une hypothèse invalide) –

4

Que diriez-vous de faire tout en une ligne?

string query = string.Join(" or ", unValidatedFeedersOnMachine.Keys.Select(x => "CompID = '" + x + "'").ToArray()) 

P.S.
Si vous ciblez .net 4.0, vous pouvez sauter la .ToArray()

+1

Je suis en .net 2.0 –

+1

@Night Walker: eh bien, malheureusement, ce code n'est pas très utile dans votre cas. BTW, vous devriez dire/tag votre question pour indiquer que vous êtes en .net 2.0, parce que c'est de plus en plus rare comme exigence ... – digEmAll

+0

vous avez raison, j'oublie toujours le problème 2.0. –

0

J'ai tendance à faire

var _sqlString = new StringBuilder(); 
foreach(string reelid in unValidatedFeedersOnMachine.Keys) {      
    if(_sqlString.ToString().Length != 0) { 
     _sqlString.Appened(" or ") 
    } 
    _sqlString.Append("CompID = '").Append(reelid).Append("' "); 
} 
+0

vous pouvez simplement vérifier 'StringBuilder.Length', sans' ToString() ' – abatishchev

Questions connexes