在C#中,如何将可变参数列表传递给另一个接受可变列表的方法,最好不要花很多钱?
例如:
class StringHelper
{
public string Concat(params string[] values)
{
lock (_stringBuilder)
{
Clear();
for (var i = 0; i < values.Length; i++)
_stringBuilder.Append(values[i]);
return _stringBuilder.ToString();
}
}
}
static class StringUtilShared
{
static readonly StringHelper _stringHelper = new StringHelper(256);
public static string Concat(this string str, params string[] values)
{
return _stringHelper.Concat(str, /* pass args here! */);
}
}
而不是使用接受数组的方法,您的方法应接受IEnumerable<string>
。由于它们只是“迭代器”,因此当您要传递额外的元素时,无需复制所有元素。
[首先,将Concat
的实际逻辑放入接受IEnumerable<string>
的方法中,并且该方法具有一个可变的Concat
重载,该方法调用了IEnumerable<string>
重载:
class StringHelper
{
public string Concat(IEnumerable<string> values)
{
lock (_stringBuilder)
{
Clear();
foreach (string value in values)
_stringBuilder.Append(value);
return _stringBuilder.ToString();
}
}
public string Concat(params string[] values) {
return Concat((IEnumerable<string>)values);
}
}
现在,您可以在扩展方法中调用IEnumerable<string>
重载:
public static string Concat(this string str, params string[] values)
{
return _stringHelper.Concat(values.Prepend(str));
}