5

我有以下字符串:

string source = "Test/Company/Business/Department/Logs.tvs/v1";

/字符是字符串中各个元素之间的分隔符。我需要获取字符串的最后两个元素。为此,我有以下代码。这工作正常。有没有更快/更简单的代码?

代码

    static void Main()
    {
        string component = String.Empty;
        string version = String.Empty;
        string source = "Test/Company/Business/Department/Logs.tvs/v1";
        if (!String.IsNullOrEmpty(source))
        {
            String[] partsOfSource = source.Split('/');
            if (partsOfSource != null)
            {
                if (partsOfSource.Length > 2)
                {
                    component = partsOfSource[partsOfSource.Length - 2];
                }

                if (partsOfSource.Length > 1)
                {
                    version = partsOfSource[partsOfSource.Length - 1];
                }
            }
        }

        Console.WriteLine(component);
        Console.WriteLine(version);
        Console.Read();
    }
4

7 回答 7

4

为什么没有正则表达式?这个相当简单:

.*/(?<component>.*)/(?<version>.*)$

您甚至可以标记您的组,以便为​​您的匹配做所有您需要做的就是:

component = myMatch.Groups["component"];
version = myMatch.Groups["version"];
于 2013-01-23T16:40:23.410 回答
3

以下应该更快,因为它只扫描尽可能多的字符串以找到两个/并且它不会打扰拆分整个字符串:

string component = "";
string version = "";
string source = "Test/Company/Business/Department/Logs.tvs/v1";
int last = source.LastIndexOf('/');
if (last != -1)
{
    int penultimate = source.LastIndexOf('/', last - 1);
    version = source.Substring(last + 1);
    component = source.Substring(penultimate + 1, last - penultimate - 1);
}

也就是说,与所有性能问题一样:配置文件!将这两个与现实生活中的大量输入并排尝试,看看哪个最快。

(此外,如果输入中没有斜杠,这将留下空字符串而不是抛出异常......但是如果source为空则抛出,我懒惰。)

于 2013-01-23T16:41:18.210 回答
2

您的代码大部分看起来都很好。有几点需要注意:

  1. String.Split()永远不会返回 null,因此您不需要对其进行 null 检查。
  2. 如果source字符串少于两个/字符,您将如何处理?(原帖已更新以解决此问题)
  3. 如果您的源字符串为空或空(或无效),您真的只想输出空字符串吗?如果您对输入的性质有特定的期望,那么当这些期望未得到满足时,您可能需要考虑快速失败。
于 2013-01-23T16:37:29.927 回答
2

鉴于您正在寻找特定索引处的子字符串,您的方法是最合适的方法。在这种情况下执行相同操作的 LINQ 表达式可能不会提高代码或其可读性。

作为参考,这里有一些来自 Microsoft 的关于使用字符串和 LINQ 的重要信息。特别是请参阅此处的文章,该文章涵盖了 LINQ 和 RegEx 的一些示例。

编辑:+1 对于马特在 RegEx 方法中的命名组......这是我见过的最好的解决方案。

于 2013-01-23T16:41:14.380 回答
1

你可以尝试这样的事情,但我怀疑它会快得多。您可以使用 System.Diagnostics.StopWatch 进行一些测量,看看您是否觉得有必要。

string source = "Test/Company/Business/Department/Logs.tvs/v1";

int index1 = source.LastIndexOf('/');
string last = source.Substring(index1 + 1);

string substring = source.Substring(0, index1);
int index2 = substring.LastIndexOf('/');
string secondLast = substring.Substring(index2 + 1);
于 2013-01-23T16:42:38.900 回答
1

我会尝试

        string source = "Test/Company/Business/Department/Logs.tvs/v1";

        var components = source.Split('/').Reverse().Take(2);

        String last = string.Empty;

        var enumerable = components as string[] ?? components.ToArray();
        if (enumerable.Count() == 2)
            last = enumerable.FirstOrDefault();
        var secondLast = enumerable.LastOrDefault();

希望这会有所帮助

于 2013-01-23T17:31:56.950 回答
-1

您可以使用以下过程检索最后两个单词:

string source = "Test/Company/Business/Department/Logs.tvs/v1";

 String[] partsOfSource = source.Split('/');
if(partsOfSourch.length>2)
 for(int i=partsOfSourch.length-2;i<=partsOfSource.length-1;i++)
console.writeline(partsOfSource[i]);
于 2013-01-24T11:20:02.923 回答