确定,
我们的代码中有很多 where 子句。我们有很多方法可以生成一个字符串来表示 in 条件。我想提出一个干净的方法如下:
public static string Join<T>(this IEnumerable<T> items, string separator)
{
var strings = from item in items select item.ToString();
return string.Join(separator, strings.ToArray());
}
可以按如下方式使用:
var values = new []{1, 2, 3, 4, 5, 6};
values.StringJoin(",");
// result should be:
// "1,2,3,4,5,6"
所以这是一个很好的扩展方法,可以完成一项非常基础的工作。我知道简单的代码并不总是变成快速或有效的执行,但我只是好奇我能用这个简单的代码错过了什么。我们团队的其他成员都在争论:
任何专家来加入?
此致
埃里克。
答案 0 :(得分:5)
关于第一个问题,您可以添加另一个'formatter'参数来控制每个项目转换为字符串:
public static string Join<T>(this IEnumerable<T> items, string separator)
{
return items.Join(separator, i => i.ToString());
}
public static string Join<T>(this IEnumerable<T> items, string separator, Func<T, string> formatter)
{
return String.Join(separator, items.Select(i => formatter(i)).ToArray());
}
关于后两个问题,我不担心它,除非你后来遇到性能问题并发现它是一个问题。然而,它不太可能成为瓶颈......
答案 1 :(得分:3)
出于某种原因,我认为String.Join
是根据StringBuilder
类实现的。但如果不是,则以下内容可能对大型输入执行得更好,因为它不会为迭代中的每个连接重新创建String
对象。
public static string Join<T>(this IEnumerable<T> items, string separator)
{
// TODO: check for null arguments.
StringBuilder builder = new StringBuilder();
foreach(T t in items)
{
builder.Append(t.ToString()).Append(separator);
}
builder.Length -= separator.Length;
return builder.ToString();
}
编辑:以下an analysis适用于StringBuilder
和String.Join
。{/ p>
答案 2 :(得分:0)
这也可以:
public static string Test(IEnumerable<T> items, string separator)
{
var builder = new StringBuilder();
bool appendSeperator = false;
if(null != items)
{
foreach(var item in items)
{
if(appendSeperator)
{
builder.Append(separator)
}
builder.Append(item.ToString());
appendSeperator = true;
}
}
return builder.ToString();
}
答案 3 :(得分:0)
您缺少对序列和序列项的空检查。是的,它不是最快,最有效的内存方式。可能只需枚举序列并将项目的字符串表示形式呈现为StringBuilder
。但这真的很重要吗?您是否遇到性能问题?你需要优化吗?
答案 4 :(得分:0)
为什么不使用StringBuilder,并自行遍历该集合,追加。 否则,您将创建一个字符串数组(var字符串),然后执行Join。