【发布时间】:2015-06-05 23:40:24
【问题描述】:
我想编写一个 C# 字符串扩展方法 ClosestIndexOf(char, index),它可以让我在提供的索引周围的字符串中找到最接近的某个字符的索引。
让我们用我的输入字符串检查一些示例:
0 1 2 3 4 5
01234567890123456789012345678901234567890123456789012345
--------------------------------------------------------
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
输入字符串长度为 56(我添加了以 0 开头的索引位置。
示例结果调用:
input.ClosestIndexOf(' ', 30); // 27
input.ClosestIndexOf(' ', 35); // 39
input.ClosestIndexOf(' ', 50); // 50
input.ClosestIndexOf(' ', 19); // 17 & 21 have same offset, return 21
input.ClosestIndexOf(' ', 60); // OutOfRangeException
input.ClosestIndexOf('x', 30); // -1
到目前为止我已经写了这个,但它需要更多的测试,而且很丑陋,条件太多。
// index is out of range
if (index > value.Length)
throw new ArgumentOutOfRangeException();
// get closest index below and above specified "index" position
int below = result.LastIndexOf('-', index - 1);
int above = result.IndexOf('-', index);
// followed by conditions
我希望这个问题或多或少是一个数学问题/表达式,以便我可以避免条件并使其更简单。
This is initial code 供您使用。正如您从结果中看到的那样,当发现特定字符上下或两者都没有时,我的初始代码有效。但是如果每个条件都具有值-1,我将不得不引入其他条件。我没有添加这些,因为这正是我想要优化的。
您会对初始代码进行哪些优化,以使其更短、性能更好并且条件更少?
【问题讨论】:
-
@Robert:我不确定
index >= value.Length...我认为应该是index > value.Length。"X".IndexOf('X', 1)是 -1(而LastIndexOf抛出)。如果你改变它,那么你可以删除if (...),然后先移动IndexOf -
作为旁注,我不会那样做代码。如所写,如果您有“0123456789”并且您从 char 9 的索引 8 开始执行最接近,则将检查字符串
01234567,而您可以在两步后停止(啊……我不知道怎么解释) -
@xanatos:你是对的。我在 DotNetFiddle 上的实际代码示例使用了大于比较。让我对我的问题进行相同的编辑。是的,你是对的我不知道你在第二条评论中的意思。
标签: c# optimization conditional-statements