组合列表时我有一些特殊要求。我将尝试举例说明。让我们说我正在使用2个GamePlayer对象列表。 GamePlayer有一个名为LastGamePlayed的属性。通过GamePlayer.ID属性识别唯一的GamePlayer。现在我想将listA和listB组合成一个列表,如果两个列表中都有给定的播放器,我想保留listA中的值。
我不能只是组合列表并使用比较器,因为我的唯一性基于ID,如果我的比较器检查ID,我将无法控制它是否选择listA或listB的元素。我需要这样的东西:
for each player in listB
{
if not listA.Contains(player)
{
listFinal.Add(player)
}
}
但是,是否有更优化的方法来执行此操作,而不是为listB中的每个元素搜索listA?
****编辑****:或者,如果我想根据LastGamePlayed的值选择保留哪个GamePlayer(而不是知道ListA优先于ListB),该怎么办?所以我想要一个独特的GamePlayer对象列表但是对于每个玩家我想要GamePlayer对象和最新的LastGamePlayed?基本上我需要一种方法来确定当存在重复的GamePlayers时要保留哪个对象。
答案 0 :(得分:2)
您应该能够使用linq可枚举扩展Concat和Exept来实现此目的。
listA.Concat(listB.Except(listA的);
这将删除B中与A匹配的项目,并将结果添加到A。
您必须编写IEqualityComparer,按ID进行比较。
这些方法的文档可以在这里找到:
IEqualityComparer文档可以在这里找到:
答案 1 :(得分:1)
现在已经澄清了,问题基本上是这样的:
LastGamePlayed
。我会用分组来做到这一点:
var players = from p in listA.Concat(listB)
group p by p.ID into g
select g.OrderByDescending(x => x.LastGamePlayed).First();
如果性能问题,有“更快”的方法来写这个,但我会从这开始。
答案 2 :(得分:0)
您可以通过从list2构建一个集合然后用list1覆盖(或插入)项目,然后将该集合转换回列表来编写O(n log n)解决方案。
如果列表已经排序,你可以通过手工合并来做O(n)。