首页 > 解决方案 > 如何合并`列表` 并删除所有键的名称/类对的重复项

问题描述

如果我们合并两个结果列表,我有 2 个列表,Result其中Value有一些重复的名称/类。

如何合并List<Value>和删除所有键的名称/类对的重复项?

var result1 = new List<Result>
    {
        new Result{Key = "X", Values = new List<Value>{new Value{Name = "A1", Class = "C1"}}},
        new Result{Key = "Y", Values = new List<Value>{new Value{Name = "B1", Class = "D1"}}}
    };

    var result2 = new List<Result>
    {
        new Result{Key = "X", Values = new List<Value>{new Value{Name = "A1", Class = "C1"}, new Value{Name = "A2", Class = "C1"}}},
        new Result{Key = "Y", Values = new List<Value>{new Value{Name = "B2", Class = "D2"}}}
    };

我在这里尝试过,

    var lstResult = new List<Result>();

    var groups = result1.Concat(result2).GroupBy(a => a.Key);

    foreach (var group in groups)
    {
        lstResult.Add(new Result
        {
            Key = group.Key,
            Values = group.Select(x => x.Values).ToList()
        });
    }


 public class Result
    {
        public string Key { get; set; }
        public List<Value> Values { get; set; }
    }

    public class Value
    {
        public string Name { get; set; }
        public string Class { get; set; }
    }

在上面的代码中,我遇到了错误,

 Values = group.Select(x => x.Values).ToList() //error

无法将类型“System.Collections.Generic.List<System.Collections.Generic.List<net452.Program.Value>>”隐式转换为“System.Collections.Generic.List<net452.Program.Value>”

标签: c#

解决方案


以下作品,没有重复。它与 Андрей Саяпин 的答案基本相同,但GetHashCode也被覆盖。

public class Result
{
    public string Key { get; set; }
    public List<Value> Values { get; set; }
}

public class Value
{
    public string Name { get; set; }
    public string Class { get; set; }

    public override bool Equals(object other)
        => other is Value o && Name == o.Name && Class == o.Class;

    public override int GetHashCode() => (Name, Class).GetHashCode();
}

class Program
{
    static void Main(string[] args)
    {
        var result1 = new List<Result>
        {
            new Result{Key = "X", Values = new List<Value>{
                new Value{Name = "A1", Class = "C1"}}},

            new Result{Key = "Y", Values = new List<Value>{
                new Value{Name = "B1", Class = "D1"}}}
        };

        var result2 = new List<Result>
        {
            new Result{Key = "X", Values = new List<Value>{
                new Value{Name = "A1", Class = "C1"},
                new Value{Name = "A2", Class = "C1"}}},

            new Result{Key = "Y", Values = new List<Value>{
                new Value{Name = "B2", Class = "D2"}}}
        };

        var lstResult = new List<Result>();

        var groups = result1.Concat(result2).GroupBy(a => a.Key);

        foreach (var group in groups)
        {
            lstResult.Add(new Result()
            {
                Key = group.Key,
                Values = group.SelectMany(x => x.Values).Distinct().ToList()
            });
        }
    }
}

推荐阅读