检查元组列表中的重复项

时间:2017-11-07 17:57:26

标签: c# list tuples

我试图在我的元组列表中找到重复项。以下是我的代码构建方式:

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

  • 按名称分组
  • 排除&#39; self&#39;来自重复检查
  • 加入+分隔所有重复项
  • 使用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 :(得分:0)

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