2

メソッドの後でもRemoveAt()、リストは同じままで、エラーも発生しません。

foreach (var row in queryCandidates.ToList())
{
    try
    {
        xString = queryCandidates.ToList().ElementAt(i).District;
        int.TryParse(xString, out xNumber);

        temp = xNumber.Equals(districtNumber);
        System.Diagnostics.Debug.Write(temp+ " ");
        System.Diagnostics.Debug.Write(i+" ");
        if (temp == false)
        {
            System.Diagnostics.Debug.WriteLine(" i is:"+i);

            //not working even when it should
            queryCandidates.ToList().RemoveAt(i);

        }
    }

    catch { }
    i++;
    if (last == i)
    {
        System.Diagnostics.Debug.WriteLine("before ending loop: ");
        return View(queryCandidates.ToList());
    }
}

System.Diagnostics.Debug.WriteLine("after ending the loop: ");
return View(queryCandidates.ToList());
4

6 に答える 6

7

ToList()新しいインスタンスを作成します。このインスタンスから要素を削除しています。元の列挙可能要素から要素を削除していません。

代わりに、次のようなことを行う必要があります。

var candidates = queryCandidates.ToList();
var elementsToRemove = new List<int>();
foreach (var row in candidates)
{
    // ...
    xString = candidates[i].District;
    // ...
    if (temp == false)
    {             
        // ... 
        elementsToRemove.Add(i);
    }  
}

for(int i = elementsToRemove.Count - 1; i >= 0; --i)
    candidates.RemoveAt(elementsToRemove[i]);

return View(candidates);

の使用にご注意くださいelementsToRemove。ループ内でアイテムを直接削除することはできません。これにより、例外がスローされます。


ToListまた、すべてのデータをコピーすることに注意してください。あなたがそれを呼び出すたびに。これをループで行うのは良い考えではないことは明らかです。

于 2012-10-17T15:45:29.277 に答える
4
queryCandidates.ToList().RemoveAt(i);

ToList() はまったく新しいリストを作成し、そこから要素を削除しますが、そのリストはとうの昔になくなっています。

試す:

var newList = queryCandidates.ToList();

for (int i=newList.Count-1; i>=0; i--){
 ///snip
 newList.RemoveAt(i);

foreach を foreach で反復処理している間はリストを変更できないため、foreach を for に (逆に) 変更したことに注意してください。

于 2012-10-17T15:47:23.407 に答える
3

ToList() 関数は、呼び出すたびに新しいリストを作成します。オブジェクトは、元のリストからではなく、そのリストから削除されます。そのため、foreach の前に ToList を 1 回呼び出す必要があります。

それが完了すると、removeAt() 呼び出しが機能し、新しい問題が発生します。これは、foreach ループ内からリストを変更しようとしているからです。そのため、remove もループから外すようにコードを書き直す必要があります。

于 2012-10-17T15:49:43.603 に答える
1

タイプ queryCandidates が何であるか正確にはわかりませんが、更新が表示されない理由は、間違ったオブジェクトから要素 'i' を削除しているためです。ToList() 関数は List タイプの新しいオブジェクトを作成します。変更を保持したい場合は、そのリストをキャッシュして、元の queryCandidates オブジェクトを使用する場所で使用する必要があります。

于 2012-10-17T15:47:31.100 に答える
0

queryCandidatesリストではありません。

アイテムを削除する新しいインスタンスを作成するリストに変換していますが、queryCandidatesそれ自体には影響しません。

できるよ:

var queryCandidates myCollection.ToList();

その後

queryCandidates.RemoveAt(i);

于 2012-10-17T15:46:15.033 に答える