Можно ли ссылаться на предыдущий параметр как значение параметра по умолчанию в методе C #? - PullRequest
4 голосов
/ 28 июня 2019

Я планирую написать метод расширения C #, чтобы объединить только определенный диапазон элементов массива строк.Например, если у меня есть этот массив:

+-----+  +-----+  +-------+  +------+  +------+  +-----+
| one |  | two |  | three |  | four |  | five |  | six |
+-----+  +-----+  +-------+  +------+  +------+  +-----+
   0        1         2          3         4        5

И я хочу присоединиться к ним, используя , от индекса 2 до индекса 4. Я получил three,four,five.Если пользователь не предоставляет начальный и конечный индексы, тогда мой метод Join объединит все элементы массива.Ниже мой метод подписи.

public static class StringSplitterJoinner
{
    public static string Join(this string[] me, string separator, int start_index = 0, int end_index = me.Length - 1) {

    }
}

Проблема в том, что параметр end_index не может ссылаться на первый параметр me и выдает ошибку.Я не хочу, чтобы пользователь всегда предоставлял start_index и end_index. Я хочу, чтобы у моего метода были значимые значения по умолчанию.В таком случае, как я могу решить эту проблему?

Ответы [ 3 ]

6 голосов
/ 28 июня 2019

Я предлагаю использовать перегрузка :

public static string Join(this string[] me, string separator) {
  //TODO: add parameters' validation

  return Join(me, separator, 0, me.Length - 1);
}

public static string Join(this string[] me, string separator, int start_index) {
  //TODO: add parameters' validation

  return Join(me, separator, start_index, me.Length - 1);
}

public static string Join(this string[] me, string separator, int start_index, int end_Index) {
  //TODO: implement logic here
}
3 голосов
/ 28 июня 2019

Как насчет этого:

public static class StringSplitterJoinner
{
    public static string Join(this string[] me, string separator, int start_index = 0, int? end_index = null)
    {
        if (!end_index.HasValue) end_index = me.Length - 1;
    }
}
1 голос
/ 29 июня 2019

Вы также можете сделать это:

public static string Join<T>(this IReadOnlyCollection<T> me,
  string separator, int startIndex = 0, int endIndexInclusive = -1)
{
  if (endIndexInclusive < 0)
    endIndexInclusive += me.Count;

  var range = me.Skip(startIndex).Take(endIndexInclusive - startIndex + 1);
  return string.Join(separator, range);
}

Идея здесь заключается в том, что отрицательные индексы отсчитываются с другого конца, поэтому -1 - последний индекс, -2 - этоиндекс от второго до последнего и так далее.Значение, принятое, если аргумент не указан явно, -1, означает последнюю запись в коллекции.

(Вы также можете включить if (startIndex < 0) startIndex += me.Count;, если хотите.)

Методбыл сделан общим (общим), но все еще может использоваться на string[].Пример:

string[] myArray = ...
var joined = myArray.Join(",", 2, -3); // skips first two, and last two, entries

Помните, что -3 также можно записать как ~2, используя побитовое дополнение.Это выглядит более симметрично, myArray.Join(",", 2, ~2).

...