【问题标题】:How to check if an item exists in more than one listbox? ASP.NET/C#如何检查一个项目是否存在于多个列表框中? ASP.NET/C#
【发布时间】:2010-12-14 05:23:44
【问题描述】:

我有三组列表框,我将项目从 lb1 移动到 lb2,从 lb3 到 lb4,从 lb5 到 lb6。左侧的列表框包含相同的项目,如果左侧列表框中的一个或多个项目添加到右侧的多个列表框中,我不希望用户能够提交页面。例如,lb1、lb3 和 lb5 中的 A 项只能保存在 lb2、lb4 或 lb6 中,不能保存在其中的两个或三个中。

我想在提交页面之前执行此检查(稍后我将使用 javascript 添加验证),我想知道执行此操作的最有效方法是什么。

将所有项目添加到列表中并检查是否有重复项?

提前致谢。

编辑: 像这样:

            List<string> groupList = new List<string>();
            foreach (ListItem item in lbFullAccess.Items)
            {
                groupList.Add(item.Value.ToString());
            }
            foreach (ListItem item in lbContributor.Items)
            {
                groupList.Add(item.Value.ToString());
            }
            foreach (ListItem item in lblReadOnly.Items)
            {
                groupList.Add(item.Value.ToString());
            }

【问题讨论】:

  • 为什么不遍历列表框并检查?在提交时为每个列表框使用 DISTINCT 怎么样?

标签: c# javascript asp.net


【解决方案1】:

嗯,有一百种不同的方法可以做到。您的迭代建议绝对没有错。

你可以在 LINQ 中找到一点乐趣:

public bool AreAllValuesUnique()
{
    // Build up a linq expression of all of the ListItems
    // by concatenating each sequence
    var allItems = lbFullAccess.Items.Cast<ListItem>()
        .Concat(lbContributor.Items.Cast<ListItem>())
        .Concat(lbReadOnly.Items.Cast<ListItem>());

    // Group the previous linq expression by value (so they will be in groups of "A", "B", etc)
    var groupedByValue = allItems.GroupBy(i => i.Value);

    // Finally, return that all groups must have a count of only one element
    // So each value can only appear once
    return groupedByValue.All(g => g.Count() == 1);
}

不太确定在每个集合上调用 Cast(将 ListItemCollection 的每个元素转换为 ListItem,产生 IEnumerable)的性能,但它可能可以忽略不计。

【讨论】:

    猜你喜欢
    • 2013-04-04
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    相关资源
    最近更新 更多