2011-01-17 1 views
2

У меня есть следующий код:Возможно ли определить текущую позицию при повторении ICollection?

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

Мне нужно добавить в этом цикле на каждой итерации .Appened("or ") кроме последнего.

Любая идея, как я могу знать, когда я нахожусь на последней итерации здесь?

+0

минорной ноте; если каждый ключ ('reelid'), как известно, является безопасным значением (из частных данных конфигурации и т. д.), тогда это может быть хорошо, но ** не ** использовать конкатенацию, если есть * любой шанс * пользователь мог бы повлиять на них - возможно, редактируя HTML-форму FORM. В противном случае это риск атаки SQL-инъекций. –

+0

@ Marc Gravell: Эти значения исходят от автоматической машины, нет шансов, что кто-то может повлиять на ценности. –

ответ

5

Я хотел бы сделать это наоборот - лечащий сначала как исключение проще :

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

или в .NET 4.0 просто использовать:

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

или даже лучше, если это SQL - переход к IN ...

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

(обратите внимание, что я предполагаю в вышеприведенном случае, что' reelid' является безопасным для инъекций, то есть он исходит из надежного источника, что может быть недопустимое предположение) –

4

Как сделать все в одной строке?

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

P.S.
Если вы ориентируетесь .net 4.0, вы можете пропустить .ToArray()

+1

Я в .net 2.0 –

+1

@Night Walker: ну, то, к сожалению, этот код не так полезен в вашем случае. Кстати, вы должны сказать/пометить свой вопрос, указав, что вы находитесь в .net 2.0, потому что он становится несколько нечастым, как требование ... – digEmAll

+0

Вы правы, я всегда забываю проблему 2.0. –

0

Я склонен делать это

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

вы можете просто проверить 'StringBuilder.Length', без' ToString() ' – abatishchev

Смежные вопросы