Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
195 views
in Technique[技术] by (71.8m points)

c# - How to merge `List<Value>` and remove duplicates for Name/class pair for all keys

I have 2 list of Result with having list of Value and there are some duplicates Name/Class if we merge both Result list.

How to merge List<Value> and remove duplicates for Name/class pair for all keys?

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

Here I tried,

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

In above code I am getting error at line,

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

cannot implicitly convert type 'System.Collections.Generic.List<System.Collections.Generic.List<net452.Program.Value>>' to 'System.Collections.Generic.List<net452.Program.Value>'

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The following works and has no duplicates. It is basically the same as Андрей Саяпин's answer however GetHashCode is overridden as well.

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()
            });
        }
    }
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...