C# String.Trim() 不从 MailMessage.Subject 中删除字符

C# String.Trim() not removing characters from MailMessage.Subject

我试图从 MailMessage 对象的 Subject 属性 中删除某些符号。我正在经历的是它什么都不做。即使在将 Subject 分配给一个字符串并对其进行修剪之后,最终的 Subject 仍然包含符号。 (示例中未显示)

MailMessage mailMessage = new MailMessage
{
    From = new MailAddress(mail.SenderEmailAddress),
    SubjectEncoding = System.Text.Encoding.UTF8,
    Subject = mail.Subject.Trim(new char[] {}), //symbol list, like ":", "~", ">"
    Body = mail.Body
};

String path = @"C:\Users\" + Environment.UserName + @"\Documents\EML\";

if (!Directory.Exists(path))
{
    Directory.CreateDirectory(path);
}

path = @"C:\Users\" + Environment.UserName + @"\Documents\EML\"
    + mailMessage.Subject + ".eml";

MessageBox.Show(path);

消息框目前只是看符号是否被移除,path稍后会放入方法中。

mail has subject RE: dog, .Trim tries to remove :,

MessageBox shows C:\Users\user\Documents\EML\RE: dog.eml.

来自 MSDN:

String.Trim Method () - Removes all leading and trailing white-space characters from the current String object.

因此,Trim 不会删除字符串中间的字符。评论者建议改用 Replace,但没有像您正在使用的那样采用字符数组的签名。一个简单的解决方法是扩展方法。

    class Program
    {

        static void Main(string[] args)
        {
            string text = "This:is~a>test";
            string subject = text.ReplaceFromCollection(new char[] { ':', '~', '>'}); //symbol list, like ":", "~", ">"

            Console.WriteLine($"{text}\n{subject}");
            Console.ReadLine();
        }

    }

    static class Extensions
    {
        public static String ReplaceFromCollection(this string text, IEnumerable<char> characters)
        {
            foreach (var chr in characters)
            {
                text = text.Replace(chr.ToString(), String.Empty);
            }
            return text;
        }
    }

使用此方法,字符串中与数组中的字符匹配的每个字符都将被一个空字符串一一替换。然后将结果传回。

More reading 关于扩展方法。

String.Trim(Char[]) 方法,根据 official MSDN documentation,从当前字符串对象中删除数组中指定的一组字符的所有前导和尾随出现。如果您想从字符串中删除所有出现的指定字符列表,即使它们没有出现在字符串的开头或结尾,您可能需要使用不同的方法。

给定以下示例字符串和以下替换:

String text = "This is: the~ mail sub~ject!";
Char[] replacements = new Char[] { ':', '~' };

您可以使用多种方法执行此操作。这是包含其中一些的列表:

1) 使用String.Split and String.Join

text = String.Join(String.Empty, text.Split(replacements));

2) 使用 LINQ

text = new String
(
    (from c in text
    where !replacements.Contains(c)
    select c).ToArray()
);

或:

text = new String(text.Where(c => !replacements.Contains(c)).ToArray());

3) 使用正则表达式

text = Regex.Replace(text, "[:~]", String.Empty);

4) 使用循环和 String.Replace

foreach (Char c in replacements)
    text = text.Replace(c.ToString(), String.Empty);

5) 使用扩展方法

public static String RemoveChars(this String input, params Char[] chars)
{
    StringBuilder builder = new StringBuilder();

    for (Int32 i = 0; i < input.Length; ++i)
    {
        if (!chars.Contains(input[i]))
            builder.Append(input[i]);
    }

    return builder.ToString();
}

text = text.RemoveChars(replacements);

最终输出总是一样的:

This is the mail subject!