所以我有两个带有可交付物的排序列表,我想合并它们。我之前从未做过这个操作,但我无法真正做到这一点。你可以看到我写的下面的方法。我无法弄清楚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++;
}
}
}
答案 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);