如何使用Split()重构此C#代码?

时间:2009-07-23 14:37:22

标签: c# string refactoring

如何重构这一点,以便 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;
}

8 个答案:

答案 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;
    }