Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中修剪字符串的最快方法_C#_.net - Fatal编程技术网

C# C语言中修剪字符串的最快方法

C# C语言中修剪字符串的最快方法,c#,.net,C#,.net,我需要修剪百万字符串中的路径,如下所示: C:\workspace\my_projects\my_app\src\my_component\my_file.cpp 到 例如,移除路径的绝对部分,最快的方法是什么 我尝试使用正则表达式: Regex.Replace(path, @"(.*?)\src", ""), 我不会使用正则表达式,使用简单的旧方法 如果路径前缀始终相同: const string partToRemove = @"C:\workspace\my_projects\my_

我需要修剪百万字符串中的路径,如下所示:

C:\workspace\my_projects\my_app\src\my_component\my_file.cpp

例如,移除路径的绝对部分,最快的方法是什么

我尝试使用正则表达式:

Regex.Replace(path,  @"(.*?)\src", ""),

我不会使用正则表达式,使用简单的旧方法

如果路径前缀始终相同:

const string partToRemove = @"C:\workspace\my_projects\my_app\";

if (path.StartsWith(partToRemove, StringComparison.OrdinalIgnoreCase))
    path = path.Substring(partToRemove.Length);
如果前缀是可变的,则可以获取\src\的最后一个索引:


我想得再快不过了

path.Substring(33);
src之前的值是常量。它从索引33开始

C:\workspace\my_projects\my_app\src\my_component\my_file.cpp
                                    ^
如果它不总是常数,那该怎么办呢。你可以找到它一次。然后在循环内完成其余部分

int startInd = path.IndexOf(@"\src\") + 1;

// Do this inside loop. 1 million times
path.Substring(startInd);

如果您的文件都以src/filename.ext结尾,那么您可以使用.NET framework中的类来完成它,并避免使用路径和文件名时可能遇到的所有警告:

result = "src\" + Path.GetFileName(path);

因此,您应该首先仔细检查转换是否需要较长的时间。

我不确定您是否需要速度,但如果您始终获得完整路径,您可以执行一个简单的.Substring

然而,我认为你应该首先清理你的输入;在这种情况下,Uri类可以执行解析步骤:

var root = @"C:\workspace\my_projects\my_app\";
var path = @"C:\workspace\my_projects\my_app\src\my_component\my_file.cpp";
var relative = new Uri(root).MakeRelativeUri(new Uri(path));
Console.WriteLine(relative.OriginalString.Replace("/", "\\"));

请注意,这里的Uri将使用/:更改\这是.Replace原因。

使用新的正则表达式定义正则表达式并重用它 创建regex需要大量的成本

string input = "This is   text with   far  too   much   " + 
                     "whitespace.";
string pattern = "\\s+";
string replacement = " ";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);

你有没有使用过string类的Trim方法?还不够快吗?你曾经测量过它们吗?如果你提前知道长度,我想知道操纵底层数组是否会更快。我认为你做得对。你确定替换需要太长时间,并且没有将源字符串读入内存吗?为什么修剪速度是个问题?我不同意,正则表达式是好的,因为它甚至可以与其他路径、大写路径等一起工作。你的解决方案预期输入是正常的。曾经清理过您的输入。@BeowulfOF我想我误解了这个要求,然后,我将更新answerpath.IndexOf@\src\,StringComparison.OrdinalIgnoreCase;忽略案例,所以它应该可以正常工作。他还检查结果是否大于等于0I将IndexOf更改为LastIndexOf。如果用户可以提供路径前缀并在其中包含另一个src目录,则看起来更安全。@lucas你完全正确。上次我使用C时,我不得不非法下载.NET源代码或使用反编译.NET类的著名工具。是的,我记得,这是.NET的石器时代:谢谢@lucas让我觉得自己老了!石器时代的一项相对年轻的技术还很年轻,呵呵,我也记得这一点;它是.NETReflector。自从红门买下它,承诺它将永远是一个免费软件,一段时间后,它变成了一个付费软件,这就涉及到了很多戏剧性的事情。在缺少自由反射器之后,出现了许多其他此类工具。ILSpy、JustDecompile、dotPeek等等。今天我推荐dotPeek——它比Reflector好,而且它可以在可用时显示原始源代码。如果你已经习惯了重竖琴,那感觉很自然。顺便说一句,如果你使用的是R,你可以将反编译器直接集成到VS.OP提到的trim中,但他似乎真的需要一个相对的路径生成器
var path = @"C:\workspace\my_projects\my_app\src\my_component\my_file.cpp";
Console.WriteLine(path.Substring(32));
var root = @"C:\workspace\my_projects\my_app\";
var path = @"C:\workspace\my_projects\my_app\src\my_component\my_file.cpp";
var relative = new Uri(root).MakeRelativeUri(new Uri(path));
Console.WriteLine(relative.OriginalString.Replace("/", "\\"));
string input = "This is   text with   far  too   much   " + 
                     "whitespace.";
string pattern = "\\s+";
string replacement = " ";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(input, replacement);