C# 为什么TrimStart在被要求修剪字符时会更修剪字符;“PRN.NUL”吗;?

C# 为什么TrimStart在被要求修剪字符时会更修剪字符;“PRN.NUL”吗;?,c#,.net,C#,.net,代码如下: namespace TrimTest { class Program { static void Main(string[] args) { string ToTrim = "PRN.NUL"; Console.WriteLine(ToTrim); string Trimmed = ToTrim.TrimStart("PRN.".ToCharArray());

代码如下:

namespace TrimTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string ToTrim = "PRN.NUL";
            Console.WriteLine(ToTrim);
            string Trimmed = ToTrim.TrimStart("PRN.".ToCharArray());
            Console.WriteLine(Trimmed);
            ToTrim = "PRN.AUX";
            Console.WriteLine(ToTrim);
            Trimmed = ToTrim.TrimStart("PRN.".ToCharArray());
            Console.WriteLine(Trimmed);
            ToTrim = "AUX.NUL";
            Console.WriteLine(ToTrim);
            Trimmed = ToTrim.TrimStart("AUX.".ToCharArray());
            Console.WriteLine(Trimmed);
        }
    }
}
输出如下:

PRN.NUL

保险商实验室

PRN.AUX

辅助

辅名词

努尔

如您所见,TrimStart从NUL中取出了N。但对于其他字符串,即使它是以PRN开头的,也不会这样做

我尝试了.NETFramework3.5和4.0,结果是一样的。对这种行为的原因有什么解释吗

试试这个:

string ToTrim = "PRN.NUL";
string Trimmed = ToTrim.TrimStart(".NRP".ToCharArray());
Console.WriteLine(Trimmed);

注意到什么了吗?

String.TrimStart在字符级别工作。你要做的是告诉它从一开始就删除任何“P”、“R”、“N”或“.”字符,因此点后的第一个N也会被删除


如果要从字符串的开头删除某个字符串,请首先使用StartsWith确保它在那里,然后使用Substring获取字符串的正确部分。

@MattiVirkkunen的答案是正确的。但是,这里有一个解决方案,使用此扩展方法而不是
RemoveStart
方法来获得所需的结果

public static String RemoveStart(this string s, string text)
{
    return s.Substring(s.IndexOf(s) + text.Length, s.Length - text.Length);
}

当你读答案的时候,不要对自己打击太大,我是这么做的。你们都忽略了PRN、NUL和AUX。至少我没有给他可复制粘贴的代码(不是指你的代码,所以有些人有一个坏习惯,就是提供可复制粘贴的修复(我不得不承认我也犯过几次这个错误))@matti这可能是可复制粘贴的,但这不是答案。这段代码演示了相同的结果,但他能够理解发生了什么。再看一次。相同的字符数组,不同的顺序。@Will:我在发布评论后立即修改了我的评论以避免混淆,我想你看到了旧版本…@matti:这是一个两步的过程。我更喜欢.TrimStart(“PRN”)。现在我有了所有代码来执行if(x.StartsWith(somestring))y=x.Remove(0,somestring.Length);其中很多仍然在框架1.1中。@James:如果程序员不想一直重复某些东西,他们会怎么做?他们想出了一个办法!你也可以用它来做一个方法。如果你不能使用扩展方法,因为你还活在过去的十年或者其他什么,就把它扔到一个静态类中。