.NET 替换键匹配的值

.NET replacing values where keys match

提问人:DemiGod 提问时间:11/16/2022 最后编辑:DemiGod 更新时间:11/16/2022 访问量:35

问:

这是一个简单的问题。我有两个列表 ListA 和 ListB,它们都充满了带有键的相同类型的对象,但其他所有内容(除了键)都可以不同,大小、值等.....我想将 ListA 中的值替换为 ListB 中的值,它们匹配(没有 O(m n),因为我可以使用循环内循环轻松完成),并且 ListB 中确实存在但 ListA 中不存在的值应该添加到 ListA,这可能是两个我不介意的操作,但我想将难度保持在 O(n^2) 或 O(m n) 以下

我尝试使用相交,但我不确定如何从那里继续前进,我可以获得匹配的行,但如何替换添加它们......超出了我的范围。

.NET 列表 替换 匹配相

评论

0赞 Fabjan 11/16/2022
那么,您可能想使用字典的 O(1) 查找。从其中一个列表中创建一个字典,然后遍历另一个列表并检查字典中是否存在该键
0赞 DemiGod 11/16/2022
你能详细说明@Fabjan?我看到你编辑了它,谢谢你的回答,我会检查一下。

答:

1赞 Tim Schmelter 11/16/2022 #1

如果你的类覆盖了 和 (为了比较 ) 或/和 实现 ,你可以使用 和 。但是,在这种情况下,您应该使用 (left-outer-),这也是一种基于集合的方法:EqualsGetHashCodeKeyIEqualityComparer<YourClass>IntersectExceptJoin

var query =
    from b in listB
    join a  in listA on b.Key equals a.Key into ba
    from a_join in ba.DefaultIfEmpty()
    select (OnlyInB: a_join == null, A: a_join, B: b);
    

foreach(var x in query)
{
    if(x.OnlyInB)
    {
        listA.Add(x.B);
    }
    else
    {
        CompareAndTransferProperties(x.A, x.B);
    }
}

以及一个顾名思义的方法:CompareAndTransferProperties

private static void CompareAndTransferProperties(MyClass a, MyClass b)
{
    // your task ...
}

评论

0赞 DemiGod 11/16/2022
这似乎工作得很好,只是快速的附加问题,在 CompareAndTransferProperties 中......我想交换所有东西,有 50 多个属性......它们是完全相同的对象类型基本上说对象 A = 对象 b 的好方法是什么?可操作的 ?现在我找到了这个解决方案:foreach (typeof(User) 中的 PropertyInfo 属性)。GetProperties() 中。Where(p => p.CanWrite)) { 属性。SetValue(a, 属性.GetValue(b, null), null);}
1赞 Tim Schmelter 11/16/2022
@DemiGod:在 : 中提供工厂方法。在那里,您应该使用样板代码手动分配所有属性。反射是缓慢的,也不安全,这是隐藏的魔法,我会阻止,但取决于你。MyClasspublic static MyClass Copy(MyClass other)