8

System.InvalidOperationException: コレクションが変更されました列挙操作が実行されない場合があります。私の次のコードのエラー。

//temporary var for storing column sort orders according to view type
        Dictionary<string, bool?> tempColumnSortOrders=new Dictionary<string,bool?>(4);
 //Check for column name in col list
        if (tempColumnSortOrders.ContainsKey(fieldToSort))
        {
            //If exists set column sort order to new sort order
            //Set new sort order
            tempColumnSortOrders[fieldToSort] = sortOrder;
            var tempSortOrders = tempColumnSortOrders;
            //remove sort order of other columns
            foreach (var kvp in tempSortOrders)
            {
                //Reset other columns sort other than current column sort
                if (kvp.Key != fieldToSort)
                {
                    tempSortOrders[kvp.Key] = null;
                }
            }
            //Return name of column to sort
            return fieldToSort;
        }

スタックトレース

[InvalidOperationException: コレクションが変更されました。列挙操作は実行されない可能性があります。]
System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource リソース) +52 System.Collections.Generic.Enumerator.MoveNext() +44 GlaziersCenter.Handlers.GetSiteViews.getColumnToSort(Int32 viewType) in d:\Projects\GlaziersCenter\ GlaziersCenter\Handlers\GetSiteViews.ashx.cs:184 d:\Projects\GlaziersCenter\GlaziersCenter\Handlers\GetSiteViews.ashx.cs:68 の GlaziersCenter.Handlers.GetSiteViews.ProcessRequest (HttpContext コンテキスト) System.Web.CallHandlerExecutionStep.System.Web .HttpApplication.IExecutionStep.Execute() +341 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +69

4

6 に答える 6

10

代わりにこのコードを試してください。

List<string> keys = new List<string>(tempSortOrders.Keys);
foreach (var key in keys)
{
    //Reset other columns sort other than current column sort
    if (key != fieldToSort)
    {
        tempSortOrders[key] = null;
    }
}

アップデート、

コレクションをリストに変換すると、問題が解決します。

于 2013-09-16T12:16:55.620 に答える
4

foreachloop は、反復するコレクションの変更を許可しません。コレクションを変更するには、forループを使用します。

于 2013-09-16T12:17:36.387 に答える
1

コレクションを列挙して同じものを変更することはサポートされていません.単一のスレッドを使用しているため、それDictionaryを行いたい場合は、これにはやり過ぎになるものを使用できます.ConcurrentDictionary

これを試して。

foreach (var kvp in tempSortOrders.ToArray())<--Note ToArray here
{
    //Reset other columns sort other than current column sort
    if (kvp.Key != fieldToSort)
    {
        tempSortOrders[kvp.Key] = null;
    }
}
于 2013-09-16T12:19:27.060 に答える
1

エラーは、このループで辞書 tempSortOrders を変更したためです。

foreach (var kvp in tempSortOrders)
        {
            //Reset other columns sort other than current column sort
            if (kvp.Key != fieldToSort)
            {
                tempSortOrders[kvp.Key] = null;
            }
        }
于 2013-09-16T12:16:06.390 に答える
1

for each コレクションを変更しているためです

foreach ( tempSortOrders の var kvp )

tempSortOrders [kvp.Key] = null;

于 2013-09-16T12:16:19.583 に答える
0

foreachループで列挙されている間はコレクションを変更できません。これは、予期しない動作につながる可能性があるためです。

代わりに通常のforループを使用してください。

于 2013-09-16T12:15:58.960 に答える