将可变参数传递给另一种无需花费费用的方法

问题描述 投票:1回答:1

在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! */);
    }
}
c# string variadic
1个回答
1
投票

而不是使用接受数组的方法,您的方法应接受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));
}
© www.soinside.com 2019 - 2024. All rights reserved.