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
相关产品推荐
相关产品推荐

