如何重构这一点,以便 numberOfItems 不必声明为变量?
//method: gets the text in a string in front of a marker, if marker is not there, then return empty string
//example: GetTextAfterMarker("documents/jan/letter043.doc","/") returns "letter043.doc"
//example: GetTextAfterMarker("letter043.doc","/") returns ""
//example: GetTextAfterMarker("letter043.doc",".") returns "doc"
public static string GetTextAfterMarker(string line, string marker)
{
int numberOfItems = line.Split(new string[] { marker }, StringSplitOptions.None).Count();
string result = line.Split(new string[] { marker }, StringSplitOptions.None)[numberOfItems-1];
return line.Equals(result) ? string.Empty : result;
}
答案 0 :(得分:7)
var index = line.LastIndexOf (marker) ;
return index < 0 ? string.Empty : line.Substring (index + marker.Length) ;
答案 1 :(得分:4)
如果你使用的是3.5,这对Linq来说是微不足道的:
public static string GetTextAfterMarker2(string line, string marker)
{
string result = line.Split(new string[] { marker }, StringSplitOptions.None).Last();
return line.Equals(result) ? string.Empty : result;
}
答案 2 :(得分:2)
我会这样做
public static string GetTextAfterMarker(string line, string marker)
{
int pos = line.LastIndexOf(marker);
if (pos < 0)
return string.Empty;
else
return line.Substring(pos + marker.Length);
}
无需调用split,无需创建一个项目数组,基本上你只是要扔掉。
更快,资源更少。
答案 3 :(得分:2)
如果我正确地阅读了您的代码,您正试图获取最后一个实例?
string[] splits = line.Split(new string[] { marker }, StringSplitOptions.None);
return (splits.Length == 1) ? string.Empty : splits[splits.Length-1];
答案 4 :(得分:1)
尽管我不知道你是出于简单的好奇心问这个问题,我建议你不要害怕创建辅助变量,如果这样可以让你的代码更具可读性。使用这些额外变量时,您很少会降低代码性能。
答案 5 :(得分:0)
public static string GetTextAfterMarker(string line, string marker)
{
string result = line.Split(new string[] { marker }, StringSplitOptions.None)[line.Split(new string[] { marker }, StringSplitOptions.None).Count()-1];
return line.Equals(result) ? string.Empty : result;
}
为什么你想做到这一点虽然超出了我...至少可以说这很麻烦。
也许:
public static string GetTextAfterMarker(string line, string marker)
{
string[] tmp = line.Split(new string[] { marker }, StringSplitOptions.None);
string result = tmp[tmp.Length-1];
return line.Equals(result) ? string.Empty : result;
}
或者您甚至可以考虑使用.IndexOf
和.Substring
代替此类内容(未经测试):
public static string GetTextAfterMarker(string line, string marker)
{
int index = line.LastIndexOf(marker);
return index < 0 ? string.Empty : line.Substring(index + marker.Length);
}
答案 6 :(得分:0)
怎么样:
public static string GetTextAfterMarker(string line, string marker)
{
var items = line.Split(new[] {marker}, StringSplitOptions.None);
string result = items[items.Length-1];
return line.Equals(result) ? string.Empty : result;
}
答案 7 :(得分:0)
您始终可以使用正则表达式而不是拆分:
public static string GetTextAfterMarker(string line, string marker)
{
if (String.IsNullOrEmpty(line))
throw new ArgumentException("line is null or empty.", "line");
if (String.IsNullOrEmpty(marker))
throw new ArgumentException("marker is null or empty.", "marker");
string EscapedMarker = Regex.Escape(marker);
return Regex.Match(line, EscapedMarker + "([^" + EscapedMarker + "]+)").Groups[1].Value;
}