【问题标题】:Add and Remove Items from String List, Only Add if Item Doesn't Already Exist从字符串列表中添加和删除项目,仅在项目不存在时添加
【发布时间】:2014-04-07 22:04:16
【问题描述】:

我正在尝试从复选框列表中获取所选项目,并在单击按钮时将它们添加到列表框中。我能够通过使用以下方法来实现这一点:

protected void AddSelectedField(object sender, EventArgs e)
{
    foreach (ListItem column in ColumnsList.Items)
    {
        if (column.Selected)
        {
            SelectedColumns.Add(column.Text);
        }
    }

    foreach (String column in SelectedColumns)
    {
        SelectedFieldsList.Items.Add(column);
    }
}

但是,这样做的问题是用户仍然可以在回发发生后添加他们已经选择的相同项目。我尝试了以下方法,但这甚至不再将所选项目添加到列表框中:

protected void AddSelectedField(object sender, EventArgs e)
{
    foreach (ListItem column in ColumnsList.Items)
    {
        if (column.Selected)
        {
            foreach (String item in SelectedColumns)
            {
                if (item != column.Text || SelectedColumns != null)
                {
                    SelectedColumns.Add(column.Text);
                }
            }
        }
    }

    foreach (String column in SelectedColumns)
    {
        SelectedFieldsList.Items.Add(column);
    }
}

另外,我还需要添加允许用户通过循环遍历列表框中的选定项目来从列表中删除项目的功能。我试过这个:

protected void RemoveSelectedField(object sender, EventArgs e)
{
    foreach (ListItem field in SelectedFieldsList.Items)
    {
        if (field.Selected)
        {
            SelectedColumns.Remove(item);
        }
    }

    foreach (String field in SelectedColumns)
    {
        SelectedFieldsList.Items.Add(field);
    }
}

还有:

protected void RemoveSelectedField(object sender, EventArgs e)
{
    foreach (ListItem field in SelectedFieldsList.Items)
    {
        if (field.Selected)
        {
            foreach (String item in SelectedColumns)
            {
                if (item == field.Text)
                {
                    SelectedColumns.Remove(item);
                }
            }
        }
    }

    foreach (String field in SelectedColumns)
    {
        SelectedFieldsList.Items.Add(field);
    }
}

这些都没有从列表框 m 中删除选定的项目(我也假设是字符串列表)。关于检查正在添加的项目是否已经存在,我也尝试过:

protected void AddSelectedField(object sender, EventArgs e)
{
    foreach (ListItem column in ColumnsList.Items)
    {
        if (column.Selected && !SelectedColumns.Contains(column.Text))
        {
            SelectedColumns.Add(column.Text);
        }
    }

    foreach (String column in SelectedColumns)
    {
        SelectedFieldsList.Items.Add(column);
    }
}

就好像它忽略了 if 语句的第二部分,它检查列表是否包含当前列表项的文本。

【问题讨论】:

  • 你试过HashSet而不是List吗?这是一种不允许重复的数据结构。
  • 刚刚尝试过,它做同样的事情。我认为它再次添加它的事实可能是由于方法底部的 foreach 将项目添加到 SelectedFieldsList (列表框控件)。
  • @TonyBarsotti 嗯,看看你的最后一个方法protected void AddSelectedField(object sender, EventArgs e) 似乎应该做你想做的事 - 只添加不存在的列。你能说明你是如何声明SelectedColumns 的吗?
  • HashSet SelectedColumns = new HashSet();之前是 List SelectedColumns = new List();它是在我班的最顶层声明的。
  • 另外我想知道你如何在protected void RemoveSelectedField(object sender, EventArgs e) 中没有异常 - 注意 - You cannot remove elements inside a foreach-loop because the looping mechanism requires that state be saved. The runtime cannot tell if you removed an element that was to be looped over in a subsequent iteration. 换句话说,在 foreach 循环中调用 SelectedColumns.Remove(item); 应该会导致 InvalidOperationException。您可以改用for 循环。

标签: c# list


【解决方案1】:

如果 SelectedColumns 是 List 为什么不使用 Contains() 方法?

    if (column.Selected && !SelectedColumns.Contains(column.Text))
    {
        SelectedColumns.Add(column.Text);
    }

【讨论】:

  • 看他帖子的结尾,最后一个准确的方法。他就是这么做的!
  • @Leron 不错!谢谢你!我刚刚检查了几个顶级方法。
【解决方案2】:

新功能有一个很大的禁忌...

您不能遍历一个列表,同时还要更改该列表:

        foreach (String item in SelectedColumns)
        {
            if (item == field.Text)
            {
                SelectedColumns.Remove(item);
            }
        }

还有……

        foreach (String item in SelectedColumns)
        {
             if (item != column.Text || SelectedColumns != null)
                SelectedColumns.Add(item.text);
        }

这样做应该会导致异常,这让我认为代码甚至没有被调用。

另外,对于第二个代码片段,我认为 SelectedColumns != null 可能不是您的意思,因为如果它为 null,您将不会遍历它。

最后,您可以使用 var 代替 String/ListItem 并调试以查看您实际迭代的对象类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多