2013-07-16 116 views
5

我想检索给定奇数长度字符串的中间三个字符。例如,如果获取奇数长度字符串的中间三个字符

string original = "India" // expected output - "ndi" 
string original = "America" // expected output - "eri" 

我试过下面的代码,它按照要求工作,但我想知道有没有更好的办法做同样的?

public string GetMiddleString (string original) 
{ 
    string trimmed = string.Empty; 
    int midCharIndex = (original.Length/2); 
    if ((original.Length) % 2 != 0) 
    { 
     trimmed = original.Substring (midCharIndex - 1, 3); 
    } 
    else 
    { 
     trimmed = original; 
    } 
    return trimmed; 
} 
+2

传递'null',并且单个字符串抛出异常,两个字符的字符串返回不正确的结果,而4个字符的字符串是错误的结果。 – asawyer

+0

@asawyer是的,我会在我的项目中编辑相应的代码,并进行异常处理和检查空值。谢谢。 – RahulD

+0

什么是“奇怪的字符串”?一个是奇数的长度?是什么让你认为你的代码只会被这种字符串调用? –

回答

12

,而不是如果你可以使用一个三元操作

return (!String.IsNullOrEmpty(original) 
     && original.Length % 2 != 0 
     && original.Length >= 3) 
    ? original.Substring((original.Length/2) - 1, 3) 
    : original; 

这将是需要的方法中的唯一代码。增加了&& original.Length >= 3以防止出现错误。

+2

可以使用空检查。 – asawyer

+2

可读性很差。这是一个很好的例子,说明三元运营商如何被滥用,使代码真的难以理解和维护。 – CesarGon

+0

是的,我不反对。答案只是作为唯一条件的中间表达式,并随着需求而增长。 – Jonesopolis

9

这是我想出来的。不,它真的改变了很多对你的代码

public string GetMiddleString(string original) 
{ 
    if (original.Length % 2 != 0 && original.Length >= 3) 
     return original.Substring(original.Length/2 - 1, 3); 
    return original; 
} 

我会确保检查字符串的长度,这样你就不会得到任何的异常。

+0

这也可以使用空检查。 – asawyer

5

总是可以去LINQ!

if(!string.IsNullOrWhiteSpace(s) && s.Length > 4 && (s.Length % 2) != 0) { 
    return new string(s.Skip((s.Length/2) - 1).Take(3).ToArray()); 
} 
else { return string.Empty; } 
+0

这段代码检查它的字符串的长度是奇数还是不是? – RahulD

+0

@rahuldwivedi添加了奇数加长字符串的检查。 –

+0

为什么长度需要大于四?你不能从一串长度为三的字符串中取三个字符吗?而且,这消除了全部空白的字符串,这不是OP的要求之一。你是否想要使用'string.IsNullOrEmpty'? –

相关问题