c# - 比较两个 List<T> 并将其合并到新的 List<T> 中

标签 c# linq list compare iequalitycomparer

我正在尝试找出如何最好地比较和合并两个 List<T>有了新的List<T>正在生成比较每个对象内的多个属性。

class Account
{
    public Account() { }
    public string ID { get; set; }
    public string Name { get; set; }
    public string Value { get; set; }
}

List<Account> Mine = new List<Account>();
List<Account> Yours = new List<Account>();
List<Account> Ours = new List<Account>();

Account m1 = new Account(){ ID = null, Name = "C_First", Value = "joe" };
Account m2 = new Account(){ ID = null, Name = "C_Last", Value = "bloggs" };
Account m3 = new Account(){ ID = null, Name = "C_Car", Value = "ford" };

Mine.Add(m1);
Mine.Add(m2);
Mine.Add(m3);

Account y1 = new Account(){ ID = "1", Name = "C_First", Value = "john" };
Account y2 = new Account(){ ID = "2", Name = "C_Last", Value = "public" };

Yours.Add(y1);
Yours.Add(y2);

结果List<Account> Ours将有以下 List<Account>对象:

{ ID = "1", Name = "C_First", Value = "joe" };
{ ID = "2", Name = "C_Last", Value = "bloggs" };
{ ID = null, Name = "C_Car", Value = "ford" };

我需要弄清楚如何最好地比较 List<Account> 之间的 ID 和 Value 属性List<Account> Yours 的对象ID 优先于List<Account> MineList<Account> Mine值优先于 List<Account> Yours以及 List<Account> Yours 中不存在的任何对象也正在添加。

我尝试过以下方法:

Ours = Mine.Except(Yours).ToList();

结果是List<Ours>是空的。

我读过这篇文章Difference between two lists其中 Jon Skeet 提到使用自定义 IEqualityComparer<T>做我需要做的事情,但我坚持如何创建 IEqualityComparer<T>比较超过 1 个属性值。

最佳答案

不确定是否可以在“pue”LINQ 中完成,但一些过程代码就可以解决问题:

var dict = Yours.ToDictionary(y => y.Name);
foreach (var m in Mine) {
    Account y;
    if (dict.TryGetValue(m.Name, out y))
        Ours.Add(new Account { ID = y.ID, Name = m.Name, Value = m.Value });
    else
        Ours.Add(m);
}

之后,打印我们的...

foreach (var o in Ours)
    Console.WriteLine("{0}\t{1}\t{2}", o.ID, o.Name, o.Value);

...给出以下结果:

1       C_First joe
2       C_Last  bloggs
        C_Car   ford

关于c# - 比较两个 List<T> 并将其合并到新的 List<T> 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19699137/

相关文章:

.net - 循环遍历 LINQ 数据的更快方法

c# - 如何创建动态 lambda 来使用它?

Python根据预定义的映射递归地转换dict

带条件的 Python 嵌套循环

c# - Web API 重定向不起作用

c# - Task.ContinueWith 在任务完成执行之前运行

c# - 如何通过 LINQ 在二维数组中进行搜索?

c# - 如何检查 IEnumerable<DataRow> 返回 null 或有任何行?

python - 每个键有多个值的列表到字典转换?

c# - Tasks 和 WaitAll 的递归