两个索引之间的子串而不是索引,长度

时间:2015-01-30 22:58:09

标签: c#

我今天正在研究一个文本文件导入器,我厌倦了使用普通的Substring(startIndex,length)方法。我喜欢用星期五来学习新东西或想办法做新事情,所以我编写了自己的扩展,取而代之的是两个索引,因为我觉得更容易在脑海中形象化。

我最终得到了类似的东西:

public static string SubstringIx(this string value, int startIndex, int endIndex)
{
    if (value == null) throw new ArgumentNullException();
    if (endIndex > value.Length) throw new IndexOutOfRangeException("End index must be less than or equal to the length of the string.");
    if (startIndex < 0 || startIndex > value.Length + 1 ) throw new IndexOutOfRangeException("Start index must be between zero and the length of the string minus one");
    if (startIndex >= endIndex) throw new ArgumentOutOfRangeException("Start index must be less then end index");

    var length = endIndex - startIndex;
    return value.Substring(startIndex, length);
}

我的问题是,是否有一个潜在的原因,我们只给出了Substring(startIndex,length)选项,而不是类似于Substring(startIndex,endIndex)?

我喜欢替代方法的一个方面是,在挑选输入行的片段时,最后一个endIndex是下一个startIndex,因此很容易“看到”正在发生的事情:

var searchString = "ABC";
var a = searchString.SubstringIx(0, 1);
var b = searchString.SubstringIx(1, 2);
var c = searchString.SubstringIx(2, 3);

也许是一个更好的例子,我认为startIndex,endIndex让它更容易阅读,因为我认为我没有明确这一部分。考虑以下两个选项:

var searchString = GetInputLine();
var a = searchString.SubstringIx(0, 35);
var b = searchString.SubstringIx(35, 60);
var c = searchString.SubstringIx(60, 112);

var d = searchString.Substring(0, 35);
var e = searchString.Substring(35, 25);
var f = searchString.Substring(60, 52);

就个人而言,我发现第一个例子更容易阅读。

2 个答案:

答案 0 :(得分:2)

指定一维子集有两种合理的方法:

  1. 开始和长度
  2. 开始和结束
  3. 没有理由为什么其中一个应该“更好”,主要是品味问题。

答案 1 :(得分:1)

其他语言使用此方法。特别是: java.lang.StringBuilder.substring(int start,int end) 来自MSDN不少 - https://msdn.microsoft.com/en-US/library/aa988974%28v=vs.80%29.aspx

这似乎是完成同样事情的完美合理方式。