我打算编写一种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
并生成错误。我不希望用户总是提供me
和start_index
我希望我的方法具有一些有意义的默认值。在这种情况下,如何解决这个问题?
答案 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
也可以使用逐位补码写为~2
。 myArray.Join(",", 2, ~2)
看起来更对称。