C# 在列表中输出重复的行
我想在列表中按名称值查找重复项。我在下面举了一个例子,说明我正在努力实现的目标 如果我循环查询,我可以输出重复的名称值,但是我也希望将地址和ID值输出到表中 这能做到吗C# 在列表中输出重复的行,c#,linq,C#,Linq,我想在列表中按名称值查找重复项。我在下面举了一个例子,说明我正在努力实现的目标 如果我循环查询,我可以输出重复的名称值,但是我也希望将地址和ID值输出到表中 这能做到吗 public class Record { public int Id { get; set; } public string Name{ get; set; } public string Address{ get; set; } } 我使用以下查询查找重复项: var query = record.
public class Record
{
public int Id { get; set; }
public string Name{ get; set; }
public string Address{ get; set; }
}
我使用以下查询查找重复项:
var query = record.GroupBy(s => s.name).Where(s => s.Count() > 1);
这应该有效(未经测试):
以下是我的作品:
var query = records.GroupBy(s => s.Name)
.Where(s => s.Count() > 1)
.SelectMany(x => x.Select(y => new Record{ Id = y.Id, Name = y.Name, Address = y.Address}));
测试
var records = new [] {
new Record {Address = "A", Id = 1, Name = "Tim"},
new Record {Address = "B", Id = 2, Name = "Tim"},
new Record {Address = "C", Id = 3, Name = "Tim"},
new Record {Address = "D", Id = 4, Name = "Hans"}
};
获取名为
Tim
的前三条记录有两种方法:
每组输出重复项
将所有副本加载到单个表中并全部显示
首先,您需要做的是迭代分组记录:
var duplicates = records.GroupBy(r => r.Name)
.Where(g => g.Count() > 1);
foreach(var duplicateGroup in duplicates)
{
Console.WriteLine("Duplicates for: {0}", duplicateGroup.Key);
foreach(var item in duplicateGroup)
{
Console.WriteLine("Id: {0}, Address: {1}", item.Id, item.Address);
}
}
上面的代码将输出重复组中每个记录的名称
,后跟Id
和地址
值
如果要加载表中的所有副本(例如,将其导出到excel文件),则需要使用以下命令:
var duplicates = records.GroupBy(r => r.Name)
.Where(g => g.Count() > 1)
.SelectMany(g => g.ToArray());
foreach(var duplicate in duplicates)
{
Console.WriteLine("Name: {0}, Id: {1}, Address: {2}", duplicate.Name, duplicate.Id, duplicate.Address);
}
这段代码将只输出第一列中重复的名称
,这样可以更容易地查看记录。如果您只想按名称返回构成重复的所有记录,至少还有一条其他记录,那么您几乎是对的
只要这样做:
var query =
record
.GroupBy(s => s.Name)
.Where(s => s.Count() > 1)
.SelectMany(r => r);
因此,如果我从这个开始:
var record = new[]
{
new { Id = 1, Name = "Joe", Address = "X" },
new { Id = 2, Name = "Barry", Address = "Y"},
new { Id = 3, Name = "Joe", Address = "A"},
new { Id = 4, Name = "Mike", Address = "B"},
new { Id = 5, Name = "Barry", Address = "B"},
new { Id = 6, Name = "Joe", Address = "B"},
};
我得到这个:
看看@Jannik我应该直接输入p.Value还是其他什么?@Johnny:你可以看看我的答案,我刚刚测试了更新后的答案。@AshleyMedway没有,我已经测试过了,它从记录中删除了Hans
。这会起作用,但你会失去分组,不是吗?编辑:\\oops忘记它OP说他想将副本输出到表中。我认为这是最合适的方式。是的,我发现,不管怎样,保持分组没有任何意义:P
var record = new[]
{
new { Id = 1, Name = "Joe", Address = "X" },
new { Id = 2, Name = "Barry", Address = "Y"},
new { Id = 3, Name = "Joe", Address = "A"},
new { Id = 4, Name = "Mike", Address = "B"},
new { Id = 5, Name = "Barry", Address = "B"},
new { Id = 6, Name = "Joe", Address = "B"},
};