是否可以在C#方法中将以前的参数作为参数默认值引用?

时间:2019-06-28 14:41:00

标签: c# methods parameter-passing extension-methods

我打算编写一种C#扩展方法,以仅连接字符串数组的特定范围的元素。例如,如果我有以下数组:

DataService Initialize()
{
    _dataService = new DataService(); 
    var fireAndForgetTask1 = _dataService.InsertCodeDescriptionAsync();
    var fireAndForgetTask2 = _dataService.InsertHeadersAsync(); 
    return _dataService; 
}

我只想使用从索引2到索引4加入它们。我得到了+-----+ +-----+ +-------+ +------+ +------+ +-----+ | one | | two | | three | | four | | five | | six | +-----+ +-----+ +-------+ +------+ +------+ +-----+ 0 1 2 3 4 5 。 如果用户不提供开始索引和结束索引,那么我的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并生成错误。我不希望用户总是提供mestart_index我希望我的方法具有一些有意义的默认值。在这种情况下,如何解决这个问题?

3 个答案:

答案 0 :(得分:6)

我建议使用重载

[1,4,25,676,458329]

答案 1 :(得分:3)

如何?

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;
    }
}

答案 2 :(得分:1)

您也可以这样做:

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也可以使用逐位补码写为~2myArray.Join(",", 2, ~2)看起来更对称。