【发布时间】:2017-11-30 01:43:34
【问题描述】:
我有一个包含两个对象列表的数据集,其 ID 在两个列表中都是一致的,但其他属性可能不同,也可能不同。我怎样才能最有效地检索基于一个或多个属性的不同属性?
我通常的做法是这样的。我的对象设置如下:
public class Person
{
public int ID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public bool IsEqual(Person other)
{
if (Name != other.Name)
{
return false;
}
if (Age != other.Age)
{
return false;
}
return true;
}
}
IsEqual 比较器用于将其与某个等效对象进行比较。
然后我寻找修改过的人的方法是这样的:
public static List<Person> FindModifiedPeople(List<Person> listA, List<Person> listB)
{
var modifiedPeople = new List<Person>();
foreach (var personA in listA)
{
var matchingPerson = listB.FirstOrDefault(e => e.ID == personA.ID);
if (matchingPerson == null)
{
continue;
}
if (!personA.IsEqual(matchingPerson))
{
modifiedPeople.Add(personA);
}
}
return modifiedPeople;
}
在我的数据集中,我不关心 listB 中的人而不关心 listA 中的人,因此我不需要遍历这两个列表。我只需要检查 listA 中 listB 中的元素(可能存在也可能不存在)并返回已修改的人员列表(包含 listA 中的元素)。
这种方法适用于相当小的列表,但现在我有两个包含大约 160,000 人的列表,这种方法需要几分钟时间。有什么方法可以使这种方法更有效,同时仍然返回我需要它做的事情?
【问题讨论】:
-
你必须使用列表吗?如果您有此人的 ID,您不能将它们存储在字典之类的东西中吗?
-
你真的需要一起比较列表吗?如果对象已更新,为什么不直接在对象内跟踪并将其公开为布尔属性(即“person.IsDirty”)?
-
虽然我现在意识到
person.IsDirty可能不是最好的命名约定... -
另外,不要在这里重新发明轮子,覆盖Equals(object obj)而不是自己写
IsEqual() -
请注意,您处理对象集合的“常规”方法非常不寻常......列表在几乎任何集合操作中都非常糟糕 - 请参阅 stackoverflow.com/questions/113173/set-operation-in-net-c-sharp 以获得指导......
标签: c#