在字符串列表中添加和删除项目,仅当项目尚不存在时才添加

本文关键字:添加 项目 不存在 列表 字符串 删除项目 | 更新日期: 2023-09-27 17:57:18

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

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 语句的第二部分,该语句检查列表是否包含当前列表项的文本。

在字符串列表中添加和删除项目,仅当项目尚不存在时才添加

如果 SelectedColumns 是一个列表,为什么不使用 Contains() 方法?

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

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

不能循环访问列表,同时更改该列表:

        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 可能不是你的意思,因为如果它是空的,你就不会遍历它。

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