【问题标题】:Check for duplicates in a tuple-list检查元组列表中的重复项
【发布时间】:2026-02-07 21:55:02
【问题描述】:

我正在尝试在我的元组列表中查找重复项。这是我的代码的构建方式:

List<(string Surname, string Name)>

var list = new List<(string, string)>();

        //..
        while (reader.Read())
        {
            list.Add((reader["Surname"], reader["Name"]));
        };

列表的外观示例:

a1 Sara
a2 Adam
a3 Eva
a4 Adam
a5 Ragnar

有什么好的方法可以找到name的重复项,然后在旁边加上Surname

Sara
Adam a2
Eva
Adam a4
Ragnar

【问题讨论】:

  • 所以你只想在有重复的时候打印姓氏?
  • 我想在Name旁边添加Surname而不是只打印Name(就像我目前所做的那样)
  • 您想将姓氏添加到列表中的所有内容,还是只添加 duplicates ?您的问题不清楚,您甚至没有向我们展示打印名称的代码
  • 如果有两个以上的同名重复怎么办?

标签: c# list tuples


【解决方案1】:

假设如果有多个具有相同名称的重复项,您希望列出所有此类重复项,使用类似于 Gilad 的方法,您可以:

  • 按名称分组
  • 从重复检查中排除“自我”
  • 加入 + 分隔所有重复项
  • 使用 SelectMany 再次展平组

像这样:

var result = list.GroupBy(item => item.Name)
                 .SelectMany(grp => grp.Select(x => 
                 (Name: x.Name, 
                  Dupes: string.Join(",", 
                     grp.Select(y => y.Surname)
                        .Except(new[]{x.Surname})))))
                 .ToList();

示例输入:

var list = new List<(string Surname, string Name)>
{
    ("a1","Sara"),
    ("a2","Adam"),
    ("a3","Eva"),
    ("a4","Adam"),
    ("a5","Ragnar"),
    ("a6","Adam"),
};

示例输出

Name    Dupes
----    -----
Sara
Adam    a4,a6 
Adam    a2,a6 
Adam    a2,a4 
Eva   
Ragnar   

注意,由于分组,排序会丢失

【讨论】:

    【解决方案2】:

    您应该按Name分组,然后检查组中的项目数量以项目名称或全名:

    var result = list.GroupBy(item => item.Name)
                     .SelectMany(g => g.Select(item => g.Skip(1).Any() ? 
                         $"{item.Name} {item.Surname}" : item.Name))
                     .ToList();
    

    【讨论】:

      【解决方案3】:

      您可以创建一个包含所有唯一名称和这些名称的计数的元组(字符串,Int)的第二个列表。当你稍后写名字时,如果第二个列表的计数大于 1,只需附加姓氏。

      【讨论】:

        最近更新 更多