Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在列表中输出重复的行_C#_Linq - Fatal编程技术网

C# 在列表中输出重复的行

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.

我想在列表中按名称值查找重复项。我在下面举了一个例子,说明我正在努力实现的目标

如果我循环查询,我可以输出重复的名称值,但是我也希望将地址和ID值输出到表中

这能做到吗

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"},
    };