c# - 如何合并`列表` 并删除所有键的名称/类对的重复项
问题描述
如果我们合并两个结果列表,我有 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>”
解决方案
以下作品,没有重复。它与 Андрей Саяпин 的答案基本相同,但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()
});
}
}
}
推荐阅读
- java - 为 JAX-RS 配置 bean 属性
- javascript - 点击时反应按钮邮件
- python - 没有不必要的打印
- vodapay-miniprogram - 是否有任何工具可以对 VodaPay 小程序进行单元测试?
- postgresql - 如何从函数调用中返回自定义值?
- julia - `train!()` 在 Flux.jl 中有什么作用?
- c++ - C++中的复制构造函数和赋值运算符
- node.js - 如何等到 io.to().emit() 在 Javascript 中完成
- javascript - 为什么当我的 img src 是道具时不会被读取?
- amazon-web-services - AWS Greengrass lambda 部署