You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中删除ListViewItem里DisplayName重复的行

解决ListView中DisplayName重复行的问题

方案一:添加数据前先对数据源去重(推荐)

直接在遍历添加前,对原始的XElement集合按DisplayName分组去重,只保留每个DisplayName对应的第一条数据,避免后续操作控件删除项,效率更高:

// 按DisplayName分组,保留每组第一个元素
var uniqueItems = this.items
    .GroupBy(x => x.Element("DisplayName")?.Value ?? string.Empty)
    .Select(group => group.First())
    .ToList();

// 遍历去重后的集合添加到ListView
foreach (XElement item in uniqueItems)
{
    this.lstEmployees.Items.Add(
        new ListViewItem(new string[] 
            {
                item.Element("Initials")?.Value ?? "",
                item.Element("DisplayName")?.Value ?? "",
                item.Element("Dep_Name")?.Value ?? "",
                item.Element("Phoneext")?.Value ?? "",
                item.Element("Privatephone")?.Value ?? ""
            })
        {
            Tag = item
        });
}

方案二:已添加数据后删除重复项

如果已经把所有数据添加到ListView中,可通过倒序遍历(避免索引错乱),用HashSet记录已出现的DisplayName,删除重复项:

var seenNames = new HashSet<string>();
// 倒序遍历ListView项,防止删除元素时索引偏移
for (int i = lstEmployees.Items.Count - 1; i >= 0; i--)
{
    ListViewItem currentItem = lstEmployees.Items[i];
    // 假设DisplayName是第二列(索引为1)
    string displayName = currentItem.SubItems[1].Text;
    
    // HashSet.Add返回false表示该值已存在,删除当前项
    if (!seenNames.Add(displayName))
    {
        lstEmployees.Items.RemoveAt(i);
    }
}

拓展:合并重复项的部门信息

如果不想删除重复行,而是把同一用户的多个部门合并显示(用逗号分隔),可以调整分组逻辑:

var mergedEmployeeData = this.items
    .GroupBy(x => x.Element("DisplayName")?.Value ?? string.Empty)
    .Select(group => new 
    {
        Initials = group.First().Element("Initials")?.Value ?? "",
        DisplayName = group.Key,
        MergedDepartments = string.Join(", ", group.Select(x => x.Element("Dep_Name")?.Value ?? "").Distinct()),
        PhoneExt = group.First().Element("Phoneext")?.Value ?? "",
        PrivatePhone = group.First().Element("Privatephone")?.Value ?? "",
        OriginalElement = group.First()
    })
    .ToList();

foreach (var emp in mergedEmployeeData)
{
    lstEmployees.Items.Add(
        new ListViewItem(new string[] 
            {
                emp.Initials,
                emp.DisplayName,
                emp.MergedDepartments,
                emp.PhoneExt,
                emp.PrivatePhone
            })
        {
            Tag = emp.OriginalElement
        });
}

内容的提问来源于stack exchange,提问作者EeVeeAitch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:45:33