簡體   English   中英

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將被放入方法中。

郵件主題為RE: dog.Trim嘗試刪除:

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

根據MSDN官方文檔String.Trim(Char[])方法從當前字符串對象中刪除數組中指定的一組字符的所有String.Trim(Char[])和結尾出現。 如果您要從字符串中刪除所有出現的指定字符列表,即使它們沒有出現在字符串的開頭或結尾,您也可能要使用其他方法。

給定以下示例字符串和以下替換:

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);

最終輸出始終相同:

這是郵件主題!

從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;
        }
    }

使用此方法,字符串中與數組中的字符匹配的每個字符都將被一個空字符串替換為空。 然后將結果傳回。

有關擴展方法的更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM