我试图在我的元组列表中找到重复项。以下是我的代码构建方式:
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
答案 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的方法,您可以:
像这样:
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,则只需追加姓氏。