提问人:DemiGod 提问时间:11/16/2022 最后编辑:DemiGod 更新时间:11/16/2022 访问量:35
.NET 替换键匹配的值
.NET replacing values where keys match
问:
这是一个简单的问题。我有两个列表 ListA 和 ListB,它们都充满了带有键的相同类型的对象,但其他所有内容(除了键)都可以不同,大小、值等.....我想将 ListA 中的值替换为 ListB 中的值,它们匹配(没有 O(m n),因为我可以使用循环内循环轻松完成),并且 ListB 中确实存在但 ListA 中不存在的值应该添加到 ListA,这可能是两个我不介意的操作,但我想将难度保持在 O(n^2) 或 O(m n) 以下
我尝试使用相交,但我不确定如何从那里继续前进,我可以获得匹配的行,但如何替换添加它们......超出了我的范围。
答:
1赞
Tim Schmelter
11/16/2022
#1
如果你的类覆盖了 和 (为了比较 ) 或/和 实现 ,你可以使用 和 。但是,在这种情况下,您应该使用 (left-outer-),这也是一种基于集合的方法:Equals
GetHashCode
Key
IEqualityComparer<YourClass>
Intersect
Except
Join
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:在 : 中提供工厂方法。在那里,您应该使用样板代码手动分配所有属性。反射是缓慢的,也不安全,这是隐藏的魔法,我会阻止,但取决于你。MyClass
public static MyClass Copy(MyClass other)
评论