合并列表,插入唯一条目

时间:2018-10-24 15:41:38

标签: c# arraylist merge

我有2个列表。这两个列表都具有相同类型的所有元素,但是每次我需要执行以下操作时,类型都可以不同。每个列表都进行排序。

这些列表是图表的X值,每个列表是图表中一系列的X值。我需要合并它们以获得合并值。一个简单的示例是X是DateTime对象,一个列表只有工作日,而另一个列表也有周末。

更复杂的示例是相同的X值可以多次出现。因此,如果它在一个列表中出现两次,而在另一个列表中发生三次,那么我在最终列表中需要它三次。

是否有比仅遍历两个列表并根据需要将列表2中的新条目插入列表1更简单的方法?

当我遍历作为对象键入的列表(可以是数字,字符串或DateTime)时,是否可以调用一些库调用来获取每对对象上的不等式?

更新

让我根据以下评论添加一些内容:

  1. 我在编译时不知道类型。这是为了处理图表数据,X值可以是字符串,数字(int或float),DateTime以及可能的其他两种类型。我所知道的是,任何给定运行的值都将是同一类型。
  2. 我需要的与AddRange()或Union()不同。如果列表A有5次两次,列表B有5次三次,那么我在最终列表中需要3次。
  3. 我没有代码示例,因为这就是我要弄清楚的,这应该是什么代码。
  4. 基本上我需要的是Union(),但它可以处理每个列表中重复条目的情况。

1 个答案:

答案 0 :(得分:0)

这听起来像是对标准双向合并的简单修改。首先,分别对两个列表进行排序。然后,执行标准合并,仅复制匹配重复项。您只需要跟踪每个列表中的上一个项目即可。

基本上,如果两个项目不相等,并且a.current == b.prevb.current == a.prev不相等,则不复制该项目。像这样:

// This assumes that list1 and list2 are sorted.
l1 = 0
l2 = 0
lOutput = 0
l1Prev = null
l2Prev = null
while (l1 < list1.length && l2 < list2.length)
    if (list1[l1] == list2[l2])
        output[lOutput++] = list1[l1]
        l1Prev = list1[l1]
        l2Prev = list2[l2]
        l1++
        l2++
    else if (list1[l1] == l2Prev)
        // skip the list1 item because it's equal to the previous
        // list2 item
        l1Prev = list1[l1]
        l1++
    else if (list2[l2] == l1Prev)
        // skip the list2 item because it's equal to the previous
        // list1 item
        list2 = list2[l2]
        l2++
    else if (list1[l1] < list2[l2])
        output[lOutput++] = list1[l1]
        l1Prev = list1[l1]
        l1++
    else
        output[lOutput++] = list2[l2]
        l2Prev = list2[l2]
        l2++
// at this point, one of the lists is not empty
while (l1 < list1.length)
    if (list1[l1] != l2Prev)
        output[lOutput++] = list1[l1]
    l1Prev = list1[l1]
    l1++

while (l2 < list2.length)
    if (list2[l2] != l1Prev)
        output[lOutput++] = list2[l2]
    l2Prev = list2[l2]
    l2++