【发布时间】:2012-12-17 23:45:22
【问题描述】:
我有一个对象和两个列表如下:
public class MyObject
{
public int Key;
public DateTime Day;
public decimal Value;
}
List<MyObject> listA = new List<MyObject>()
{
new MyObject() { Key = 1, Day = new DateTime(2012, 12, 17), Value = 8 },
new MyObject() { Key = 1, Day = new DateTime(2012, 12, 18), Value = 8 },
new MyObject() { Key = 2, Day = new DateTime(2012, 12, 17), Value = 8 },
new MyObject() { Key = 3, Day = new DateTime(2012, 12, 17), Value = 4 },
new MyObject() { Key = 4, Day = new DateTime(2012, 12, 17), Value = 4 }
};
List<MyObject> listB = new List<MyObject>()
{
new MyObject() { Key = 1, Day = new DateTime(2012, 12, 17), Value = 2 },
new MyObject() { Key = 1, Day = new DateTime(2012, 12, 18), Value = 8 },
new MyObject() { Key = 3, Day = new DateTime(2012, 12, 17), Value = 8 },
new MyObject() { Key = 4, Day = new DateTime(2012, 12, 17), Value = 4 },
new MyObject() { Key = 5, Day = new DateTime(2012, 12, 17), Value = 10 }
};
我正在寻找的结果是:
List<MyObject> listChanges = new List<MyObject>()
{
new MyObject() { Key = 1, Day = new DateTime(2012, 12, 17), Value = -6 },
new MyObject() { Key = 2, Day = new DateTime(2012, 12, 17), Value = -8 },
new MyObject() { Key = 3, Day = new DateTime(2012, 12, 17), Value = 4 },
new MyObject() { Key = 5, Day = new DateTime(2012, 12, 17), Value = 10 }
};
基本上,我正在尝试创建一个列表,其中包含将 listA 变为 listB 所需的更改。因此,虽然可以使用 LINQ 中的 except 和 Intersect,但我认为它们不会有最好的性能来完成这样的任务,因为您仍然需要另一个比较来获得值的差异。
我的一个想法是:如果循环遍历 listA,我可以从 listA 和 listB 中删除该项目(如果找到并且此时我可以确定 +/- 差异)。完成 listA 后,listB 将只包含添加内容。
如何获得更改结果?
【问题讨论】:
-
这是您突破Stopwatch class 并测试您刚刚列出的方案的绝佳机会。 :)
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
您真的有性能/优化问题吗?您是否在比较 数千 个条目?如果不是,那么我非常怀疑是否会出现性能问题,在这种情况下,我建议您专注于组合一个易于维护的设计。关于实际设计,也许你的
MyObject应该有某种Compare方法来指示另一个MyObject实例是否相等,如果不相等,哪些方面不同。 -
John - 感谢您的澄清,对最初的标题感到抱歉。
-
Chris - 我现在没有性能问题,只是好奇。我一直在尝试看看是否有更好/更快的方法来做某事。我已经为此对象类型实现了一个 IEqualityComparer,以便在不同的场景中与 except & Intersect 一起使用,但我不确定它是否可以在这里使用(除非可以修改 except 以返回更改对象)。