组合列表但获得独特的成员

时间:2010-04-09 01:29:09

标签: .net linq list

组合列表时我有一些特殊要求。我将尝试举例说明。让我们说我正在使用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时要保留哪个对象。

3 个答案:

答案 0 :(得分:2)

您应该能够使用linq可枚举扩展Concat和Exept来实现此目的。

listA.Concat(listB.Except(listA的);

这将删除B中与A匹配的项目,并将结果添加到A。

您必须编写IEqualityComparer,按ID进行比较。

这些方法的文档可以在这里找到:

MSDN Enumerable Extensions

IEqualityComparer文档可以在这里找到:

MSDN IEqualityComparer

答案 1 :(得分:1)

现在已经澄清了,问题基本上是这样的:

  • 合并列表A和列表B中的所有元素,如果有重复项,请保留最新的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)。