2

私は結果という変数を持っています

List<List<string>>

各要素を解析して修正したい (空白を削除するなど)

            i = 0;
            foreach (List<string> tr in res)
            {
                foreach (string td in tr)
                {
                    Console.Write("[{0}] ", td);
                    td = cleanStrings(td); // line with error
                    i++;
                }
                Console.WriteLine();
            }

    public string cleanStrings(string clean)
    {
        int j = 0;                
        string temp = System.Text.RegularExpressions.Regex.Replace(clean, @"[\r\n]", "");
        if (temp.Equals("&nbsp;"))
        {
            temp = " ";
            temp = temp.Trim();
        }
        clean = temp;                        
        return clean;
    }

エラー 1 「td」は「foreach 反復変数」であるため、代入できません

どうすればこれを修正できますか?

4

4 に答える 4

12

基本的には使用しないでくださいforeach。基本的に、.NET の反復子は読み取り専用です。例えば:

for (int i = 0; i < tr.Count; i++)
{
    string td = tr[i];
    Console.Write("[{0}] ", td);
    tr[i] = CleanStrings(td);
}

i(インクリメントしていた変数を使用しましたが、それ以外の場合は使用していないことに注意してください。)

または、LINQ の使用を検討してください。

res = res.Select(list => list.Select(x => CleanStrings(x)).ToList())
         .ToList();

これは、既存のリストを変更するのではなく、新しいリストの新しいリストを作成することに注意してください。

于 2012-08-22T19:40:58.680 に答える
0

forリスト内のインデックスを取得するには、内側のループをループにする必要がありますtr。これにより、このインデックスでリスト内のエントリを置き換えることができます。ただし、外側のforeachループは保持できます。

i = 0;
foreach (List<string> tr in res) {
    for (int k = 0; k < tr.Count; k++) {
        string td = tr.[k];
        Console.Write("[{0}] ", td);
        tr[k] = cleanStrings(td); // line with no error anymore
    }
    i += tr.Count;
    Console.WriteLine();
}
Console.WriteLine("Total number of items: {0}", i);
于 2012-08-22T19:43:22.710 に答える
0

エラーが示すように、イテレータ変数を変更して List の内容を修正することはできず、外側の foreach にも同じ制約があります。いくつかのアプローチがありますが、試すことができるのは次のとおりです。

        i = 0;
        foreach (List<string> tr in res)
        {
            for (int currentItem; currentItem<=tr.Count; currentItem++)
            {
                Console.Write("[{0}] ", tr[currentItem]);
                res[i][currentItem] = cleanStrings(tr[currentItem]); // line with error
            }
            i++;
            Console.WriteLine();
        }
于 2012-08-22T19:45:16.233 に答える
0

foreach を使用して列挙している Collection を変更することはできないため、通常の for ループを使用してください。

for (int m = 0; m < res.Count; m++)
{
    for (int j = 0; j < res[m].Count; j++)
    {
        Console.Write("[{0}] ", td);
        res[m][j] = cleanStrings(res[m][j]);
        i++;
    }
    Console.WriteLine();
}
于 2012-08-22T19:42:25.480 に答える