在字符串列表中,在每个字符串的开头、结尾和中间添加字符的最快方法

5
这是我的清单:
List<string> elements = new List<string> { "apple", "orange", "peach" };

我需要一个具有以下返回值的方法:
string result = "'apple', 'orange', 'peach'";

如您所见,结果中的每个字符串首尾都需添加引号"'",然后用", "连接。那么您有什么快速、流畅的建议吗?请考虑性能问题,因为此列表可能包含大量元素,您怎么看待这一点?

为什么需要这个?这是某种代码格式化吗?如果是,那么如何处理字符串中包含的 '? - SWeko
@SWeko 这是Where Clause Generator的一部分,例如:Where Name in ('apple', 'orange', 'peach') - Saeid
那么如果其中一个字符串是O'Shea呢?如果这些字符串是用户提供的,那么你就会让应用程序面临SQL注入的风险。 - SWeko
@SWeko用户只能使用参数,但我需要生成一些In Filter,你有关于In Filter和传递参数的任何想法吗? - Saeid
1
如果您正在使用SQL Server,请查看此文,这是一篇很棒的文章。 - SWeko
3个回答

8

我给出我的建议:

string result = string.Join(", ", elements.Select(e => "'" + e + "'"));

在最后缺少一个+号 e + "'"))); - Habib
基于性能考虑,我不会选择它。为什么?对于每个元素的迭代都会调用 select 方法,最后的 string.Join 本身也使用迭代。因此,如果有 n 个元素,则会有 n+1 次迭代。 - Nikhil Agrawal
2
@NikhilAgrawal,“Select”是惰性评估的,只在调用“Join”之前调用一次。这是最接近最高效方法的方式。使用“StringBuilder”会更快,但需要更多的代码行。 - SimonC

3
如何呢?
string result = string.Empty;

if (elements.Count > 0) 
    result = "'" + string.Join("', '", elements) + "'"

你不应该从 @Saeed Neamati 那里复制第二个版本,你的第一个版本已经足够好了 - 而且我讨厌幽灵编辑。 - Habib
1
这可能不会在空列表上产生所期望的输出。 - SimonC

-1

我的建议是:

string result = 
"'" + elements.Aggregate((a, b) => string.Format("{0}', '{1}", a, b)) + "'"

顺便说一下,Stack Exchange有一个名为Code Review的网站。我认为那个地方更适合这个问题。


你的答案返回了一些额外的字符:''苹果','橙子','桃子' - Saeid
你的回答不是 OP 想要的。 - Nikhil Agrawal
1
它实际上会生成 '''apple'', 'orange'', 'peach' - SimonC
更糟糕的是,所有聚合方法和Lambda变量都可以通过使用string.Join()来避免。请查看我的答案。 - Nikhil Agrawal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接