【问题标题】:C# String.Trim() not removing characters from MailMessage.SubjectC# String.Trim() 不从 MailMessage.Subject 中删除字符
【发布时间】:2018-07-21 19:12:57
【问题描述】:

我正在尝试从 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稍后会放入一个方法中。

邮件有主题RE: dog.Trim 尝试删除:

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

【问题讨论】:

  • 你指的是mailMessage.Subject。
  • 修剪从末端移除。
  • @john 我也尝试过使用 String.Replace(),但也没有得到任何结果。
  • 也许你可以显示替换?

标签: c# trim mailmessage


【解决方案1】:

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

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

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

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

1) 使用String.SplitString.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);

最终的输出总是一样的:

这是邮件主题!

【讨论】:

    【解决方案2】:

    来自 MSDN:

    String.Trim 方法 () - 从当前 String 对象中删除所有前导和尾随空白字符。

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

        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 关于扩展方法。

    【讨论】:

    • 这绝对有效,谢谢。将阅读更多内容!
    • 我强烈建议您查看下面的 Tommaso 的答案,其中包含一些我没有涵盖的字符替换方法的选项。它们中的任何一个都可以在 String 的扩展方法中很好地工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多