【问题标题】:c# create an arbitrary length generic parameter string e.g. ?,?,?c# 创建一个任意长度的通用参数字符串,例如?,?,?
【发布时间】:2010-03-30 06:26:27
【问题描述】:

我知道我忘记了如何执行此操作,并且为时已晚。

我想以一种优雅的方式为 munged sql 命令构建一个占位符列表。

有任意个参数的命令,需要编译?,?,?

我有没有提到这是一个湿脑放屁?这就是结果:

如果你只记得我忘记的东西,欢迎你让我觉得自己更像个白痴。 ;-)


好吧,看来我应该休息一下了。

你们俩都确认了我在深入研究之前所做的事情。

这是我的名单,

string names = string.Join(",", _command.Parameters.Cast<SQLiteParameter>().Select(p => p.ParameterName).ToArray());

我只是将 p.Name 替换为 '?'

string vals = string.Join(",", _command.Parameters.Cast<object>().Select(p => "?").ToArray());

但由于某种原因我没有批准。

谢谢。

【问题讨论】:

  • 如果是用于 SQL 命令,为什么不使用参数化查询参数? SQL 查询中的字符串操作可能会导致错误的结果。
  • @Darin:这一个参数化查询。关键是查询参数的数量在编译时是未知的。
  • @jon limjap,请别管它。我只是把它撞到了问题框中。我一看到它就意识到它是多么愚蠢。
  • @Darin,它用于 SQLite 命令。 Skeet 是对的,“任意”是关键词 ;-)

标签: c# string


【解决方案1】:

嗯,这表明了自己:

string x = string.Join(",", Enumerable.Repeat("?", count).ToArray());

在 .NET 4 中,这可以稍微简化,因为 string.Join 有新的重载:

string x = string.Join(",", Enumerable.Repeat("?", count));

另一方面,我很想用循环来做:

StringBuilder builder = new StringBuilder();
for (int i = 0; i < count; i++)
{
    builder.Append("?,");
}
builder.Length--; // Remove trailing ,
return builder.ToString();

无论哪种方式,我都会把它放在一个单独的方法中,所以简洁性可能并不重要。

【讨论】:

  • 是的,第一个我看起来和我的很相似,然后我开始刮我的骆驼毛并试图说服自己正则表达式会很好。我正处于狂欢的尾声,并且很快就会出现短缺。只是想在晚上结束之前通读本节,而不会在文件中留下一些愚蠢的东西。谢谢。
  • r.e.单独的方法:这只会被调用一次,在一个简单的实现中构建一个“批量复制”命令,所以可能是内联的,因此优雅的愚蠢命令。
  • @Sky:即使它只使用一次,您仍然可以通过将其分离成一个新方法来提高可读性。如果要在更容易理解的单独方法或相对密集的单个语句之间进行选择,我会选择单独的方法。
【解决方案2】:

按照@Jon 的回答:

string.Join(",", _command.Parameters.Cast<object>().Select(p => "?").ToArray())

【讨论】:

  • 这正是我的代码中提示这个问题的内容。哈哈。太搞笑了。也许这毕竟是最好的方法。我只是觉得它闻起来。
  • string.Join(",", _command.Parameters.Cast().Select(p => "?").ToArray());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多