合并两个已经在c#中排序的列表

时间:2016-06-13 00:59:58

标签: c# merge

所以我有两个带有可交付物的排序列表,我想合并它们。我之前从未做过这个操作,但我无法真正做到这一点。你可以看到我写的下面的方法。我无法弄清楚while语句因为它一直触发异常。我不知道该怎么做......

public void MergeLists(List<Deliverable> a, List<Deliverable> b)
{
    int index1 = 0;
    int index2 = 0;

    while (a.Count() >= index1 || b.Count() >= index2)
    {
        if (a[index1].ID> b[index2].ID)
        {
            FinalDeliverables.Add(a[index1]);
            index1++;
        }
        else if (a[index1].ID < b[index2].ID)
        {
            FinalDeliverables.Add(a[index2]);
            index2++;
        }
        else if (a[index1].ID == b[index2].ID)
        {
            FinalDeliverables.Add(a[index1]);
            FinalDeliverables.Add(a[index2]);
            index1++;
            index2++;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我相信你得到的例外来自空指针。例如,如果您已经到达其中一个列表的末尾,但是您的while循环仍在尝试比较值,则会发生这种情况。解决此问题的一种方法是在if语句之前添加一个检查,以查看是否已到达列表的一端(或两端)。如果是这样,那么只需添加其他列表中的其余项目。

public void MergeLists(List<Deliverable> a, List<Deliverable> b)
{
    int index1 = 0;
    int index2 = 0;

    while (true)
    {
        // if the end of the 'a' list has been reached, then add
        // everything from the 'b' list and break from the loop
        if (index1 >= a.Count()) {
            for (int i=index2; i < b.Count(); ++i) {
                FinalDeliverables.Add(b[i]);
            }
            break;
        }

        // if the end of the 'b' list has been reached, then add
        // everything from the 'a' list and break from the loop
        if (index2 >= b.Count()) {
            for (int i=index1; i < a.Count(); ++i) {
                FinalDeliverables.Add(a[i]);
            }
            break;
        }
        if (a[index1].ID > b[index2].ID)
        {
            FinalDeliverables.Add(a[index1]);
            index1++;
        }
        else if (a[index1].ID < b[index2].ID)
        {
            FinalDeliverables.Add(a[index2]);
            index2++;
        }
        else if (a[index1].ID == b[index2].ID)
        {
            FinalDeliverables.Add(a[index1]);
            FinalDeliverables.Add(a[index2]);

            index1++;
            index2++;
        }
    }
}

请注意,此重构的副作用是您的原始while循环不再需要检查边界。相反,当其中一个列表用尽时,循环将被终止。

另请注意,此解决方案假定您的输入列表按降序顺序排序。

答案 1 :(得分:1)

您可以使用LINQ扩展方法来实现此目的,Person person = new Student("Bill", 3.5, "chem"); 的方法签名将如下所示:

MergeLists

或者您可以修改自己的方法,如下所示:在此之前让我假设以下内容,输入列表public void MergeLists(List<Deliverable> a, List<Deliverable> b) { var finalList = a.Concat(b); List<Deliverable> FinalSortedList = finalList.OrderBy(x => x.ID).ToList(); } 中的元素计数将始终大于a的元素。所以你需要做的是在调用方法之前检查元素的数量。所以电话会议如下:

b

您提到两个输入商品已排序,让我假设这些列表按升序排序。现在考虑以下代码:

if(a.Count>b.Count)
   MergeLists(a,b);
else
   MergeLists(b,a);