【问题标题】:Updating list without breaking the code [closed]在不破坏代码的情况下更新列表[关闭]
【发布时间】:2018-03-08 05:33:32
【问题描述】:

但是,我遇到了另一个问题。由于它更新了我的列表,我需要弄清楚如何在不破坏我的代码的情况下修改列表。建议?

我要做的是更新我的列表以在操作无法应用于操作并删除不符合条件的操作时发送错误消息。所以基本上,如果它不是代码 40 或 45,则将它们从列表中删除,如果代码是 40 或 45,则发送错误消息。我不知道我是否可以进一步澄清我的问题。我还是编程新手。

    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        ValidateActionSelected();

        ValidateCleared(actionsChecked);

        if (String.Equals(ddlActionsAndDocuments.SelectedItem.Text.ToString(), "XXX YYY") || String.Equals(ddlActionsAndDocuments.SelectedItem.Text.ToString(), "XXX ZZZ"))
            {
                reqEffectiveDate.ErrorMessage = "";
            }

            if (ddlActionsAndDocuments.SelectedValue == ActionTypes.XXXYYY ||
                ddlActionsAndDocuments.SelectedValue == ActionTypes.XXXYYYDenial ||
                ddlActionsAndDocuments.SelectedValue == ActionTypes.XXXzzz)
            {
                ValidateXXXYYY(actionsChecked, ddlActionsAndDocuments.Text);
            }

            if (ddlActionsAndDocuments.SelectedValue == InsuranceActionTypes.WWW ||
                ddlActionsAndDocuments.SelectedValue == InsuranceActionTypes.YYYZZZ ||
                ddlActionsAndDocuments.SelectedValue == InsuranceActionTypes.YYYWWW ||
                ddlActionsAndDocuments.SelectedValue == InsuranceActionTypes.YYYWaived)
            {
                ValidateCertificate(actionsChecked, ddlActionsAndDocuments.Text);
            }
        }
    }

    private void ValidateCleared(List<xxCaseEntity> actionsChecked)
    {
        foreach (xxCaseEntity ACTIONyy in actionsChecked)
        {
            if (ACTIONyy.XXStatusCode == 40 || ACTIONyy.XXStatusCode == 45)
            {
                DisplayErrorMessage("FR Action Cannot Apply to " + ACTIONyy.CaseIdentifier);

                actionsChecked.Remove(ACTIONyy);

            }                
        }
        return;
    }

【问题讨论】:

  • 有什么问题?
  • 我们不知道你在问什么。请阅读how to ask how to create a minimal, complete, and verifiable example
  • 请重写您的问题以实际包含一个问题,并发布所有相关代码。例如,没有解释 actionsChecked 是什么,或者你的 ValidateActionSelected() 做什么。如果这些不相关,请删除它们。请查看@johnnyRose 发布的关于如何编写正确问题的链接。
  • 我们都不知道“如何在不破坏我的代码的情况下修改列表”是什么意思。该声明过于模糊,无法采取行动。
  • foreach (xxCaseEntity action in actionsChecked.Where(action =&gt; action.XXStatusCode == 40 || action.XXStatusCode == 45).ToList()) { DisplayErrorMessage("FR Action Cannot Apply to " + action.CaseIdentifier); actionsChecked.Remove(action); }

标签: c# list


【解决方案1】:

您无法从列表中删除项目,因为您正在迭代同一列表。一种技术是创建一个新列表,然后遍历新列表。

var toRemove = new List<xxCaseEntity>();

foreach (xxCaseEntity ACTIONyy in actionsChecked)
{
    if(ACTIONyy.XXStatusCode == 40 || ACTIONyy.XXStatusCode == 45)
    {
        toRemove.Add(ACTIONyy);
    }
}

foreach (var item in toRemove )
{
    actionsChecked.Remove(item);
}

【讨论】:

  • 从技术上讲,您甚至不必创建单独的列表变量,您可以在 foreach 条件下通过在您正在迭代的列表上调用 ToList() 来完成(因为 @987654324 @ 返回一个新列表):foreach (xxCaseEntity ACTIONyy in actionsChecked.ToList()) { if (someCondition) actionsChecked.Remove(ACTIONyy); }
  • RemoveRange 不像AddRange 那样处理列表。不过,actionsChecked.RemoveAll(condition); 可能会起作用。
  • 这对一些人有所帮助。当然,它打开了新的问题。不过谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
相关资源
最近更新 更多