在迭代ICollection时是否可以确定当前位置?

时间:2011-01-17 07:43:08

标签: c# .net .net-2.0 foreach icollection

我有以下代码:

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

我需要在每个迭代.Appened("or ")上添加该循环,除了最后一个迭代。

我知道当我在最后一次迭代时我怎么知道?

3 个答案:

答案 0 :(得分: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 + "'") + ")";

答案 1 :(得分:4)

如何在一行中完成所有工作?

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

<强> P.S。
如果您的目标是.net 4.0,则可以跳过.ToArray()

答案 2 :(得分: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("' ");
}