0

ファイル内の文字列コンテンツの文字を置き換えたい。ディクショナリの下に、キーが不要な文字として表示されているため、ディクショナリの値に置き換える必要があります。

Dictionary<string, string> unwantedCharacters = new Dictionary<string, string>();
        unwantedCharacters["É"] = "@";
        unwantedCharacters["Ä"] = "[";
        unwantedCharacters["Ö"] = "\\";
        unwantedCharacters["Å"] = "]";
        unwantedCharacters["Ü"] = "^";
        unwantedCharacters["é"] = "`";
        unwantedCharacters["ä"] = "{";
        unwantedCharacters["ö"] = "|";
        unwantedCharacters["å"] = "}";
        unwantedCharacters["ü"] = "~";

ここに私が現在使用しているコードがあります.実行時間がかかりすぎるように感じます..

 for (int index = 0; index < fileContents.Length; index++)
        {
            foreach (KeyValuePair<string, string> item in unwantedCharacters)
            {
                if (fileContents.IndexOf(item.Key) > -1)
                {
                    fileContents = fileContents.Replace(item.Key, item.Value); // Replacing straight characters
                }
            }
        }

つまり、2つのレベルでループする..これを実装する他の方法..どんな助けでも大歓迎です

4

6 に答える 6

3

文字列の長さを変更していないため、 ではなく を作成unwantedCharactersするDictionary<char, char><string, string>、次のことができます。

var charArray = fileContents.ToCharArray();
for (int i = 0; i < charArray.Length; i++)
{
    char replacement;
    if (unwantedCharacters.TryGetValue(charArray[i], out replacement))
        charArray[i] = replacement;
}
fileContents = new string(charArray);

パフォーマンスはO(n)、入力文字列の長さに関係しています。

于 2013-02-22T09:13:47.297 に答える
2

ここでは fileContents が文字列値のようです。文字列に対して単に replace を呼び出すことができます。

foreach (KeyValuePair<string, string> item in unwantedCharacters)
{
    fileContents = fileContents.Replace(item.Key, item.Value); 
}
于 2013-02-22T08:59:13.450 に答える
2

この答えを見てください:答え

しかし、このコードではあなたのキャラクターを入れてください:

IDictionary<string,string> map = new Dictionary<string,string>()
    {
       {"É", = "@"},
       {"Ä", = "["},
       {"Ö", = "\\"},
       ...
    };
于 2013-02-22T09:02:25.383 に答える
2

文字列内の多くの文字を置き換えるには、StringBuilder クラスを使用することを検討してください。文字列の 1 文字を置き換えると、まったく新しい文字列が作成されるため、非常に非効率的です。以下を試してください:

var sb = new StringBuilder(fileContents.Length);

foreach (var c in fileContents)
    sb.Append(unwantedCharacters.ContainsKey(c) ? unwantedCharacters[c] : c);

fileContents = sb.ToString();

ここでは、辞書に文字 ( Dictionary<char, char>) が含まれていると想定しました。それはケースです。コメントするだけで、ソリューションを編集します。

また、それは文字列であると想定しfileContentsました。

StringBuilderの代わりにLINQを使用することもできます。

var fileContentsEnumerable = from c in fileContents
                             select unwantedCharacters.ContainsKey(c) ? unwantedCharacters[c] : c;

fileContents = new string(fileContentsEnumerable.ToArray());
于 2013-02-22T09:05:10.087 に答える
1

フィルタを作成します。ファイルの内容を処理し、処理中に置換を行います。

このようなもの:

        using(StreamReader reader = new StreamReader("filename"))
        using (StreamWriter writer = new StreamWriter("outfile"))
        {
            char currChar = 0;
            while ((currChar = reader.Read()) >= 0)
            {
                char outChar = unwantedCharacters.ContainsKey(currChar)
                                   ? unwantedCharacters[currChar]
                                   : (char) currChar;
                writer.Write(outChar);
            }
        }

fileContentsデータがメモリ内にある場合、またはループスルーが文字列または文字配列である場合は、メモリストリームを使用できます。

このソリューションは O(n) です。n はファイルの長さです。辞書のおかげです (辞書の代わりに単純なスパース配列を使用すると、かなりの速度が得られることに注意してください)。

各置換は O(n) であるため、他の人が示唆するように辞書を反復処理しないでください。ファイルを何度も処理する必要があるため、合計時間は O(n*d) になります。d は辞書のサイズです。

于 2013-02-22T09:06:16.623 に答える
0

を削除し、0 から までforeachのループに置き換えます。 この記事が役に立てば幸いです。foritem.Count

于 2013-02-22T09:07:23.630 に答える