Разверните variadi c аргументы в другой метод без затрат - PullRequest
1 голос
/ 08 января 2020

In C# как передать список аргументов variadi c другому методу, который принимает список variadi 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! */);
    }
}

1 Ответ

1 голос
/ 08 января 2020

Вместо использования методов, которые принимают массивы, ваши методы должны принимать IEnumerable<string> s. Так как они являются просто «итераторами», нет необходимости копировать все элементы, когда вы хотите передать дополнительный элемент.

Во-первых, поместите фактические логические значения c из Concat в метод, который принимает IEnumerable<string> и имеют перегрузку c переменной 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));
}
...