【问题标题】:Is it possible to determine the current position when iterating an ICollection?迭代 ICollection 时是否可以确定当前位置?
【发布时间】:2011-01-17 07:43:08
【问题描述】:

我有以下代码:

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

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

知道我如何知道我在这里的最后一次迭代吗?

【问题讨论】:

  • 小注;如果每个键 (reelid) 已知是一个安全值(来自私有配置数据等),那么这可能没问题 - 但 不要 如果有任何机会使用连接i> 用户可能会影响他们——也许是通过编辑表单的 HTML。否则这是一个 SQL 注入攻击风险。
  • @Marc Gravell:这些值来自自动机器,不可能有人能影响这些值。

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


【解决方案1】:

我会反过来做——将第一个视为异常更简单:

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 + "'") + ")";

【讨论】:

  • (请注意,我在上面假设reelid 是注入安全的 - 即它来自受信任的来源;这可能是一个无效的假设)
【解决方案2】:

在一行中做所有事情怎么样?

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

附言
如果您的目标是 .net 4.0,则可以跳过 .ToArray()

【讨论】:

  • @Night Walker:好吧,不幸的是,这段代码在您的情况下并不是那么有用。顺便说一句,您应该说出/标记您的问题以表明您在 .net 2.0 中,因为要求它变得有点不常见......
【解决方案3】:

我倾向于这样做

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

【讨论】:

  • 你可以只检查StringBuilder.Length,没有ToString()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2017-08-04
相关资源
最近更新 更多