嵌套while循环替换项
本文关键字:替换 循环 while 嵌套 | 更新日期: 2023-09-27 18:28:34
我写了一些代码,遵循下面的基本模式。我想看看是否有更好、更简洁或性能更好的想法来实现它要实现的目标。目标是将一个列表中的项目与另一个列表的项目进行比较,如果匹配,则执行操作。我让它工作的唯一方法是下面的想法,但我是c和.net的新手,不确定是否有更好的方法。
list A
list B
int counter;
int counter2;
while (counter < comparison item)
{
while (counter2 < comparison item 2)
{
if (A[counter] == B[counter2])
{
// do stuff
}
counter2++;
}
counter++;
}
这个双循环结构很简单,但不具有性能。问题是比较的数量:如果第一个集合有N
项,而第二个集合有M
项,那么就会有N*M
比较。每组1000个项目,我们谈论的是1000000个比较。
更好的方法是对第一个集合的项目进行散列,然后在散列中搜索第二个集合中的项目。由于哈希是在摊销的恒定时间内完成的,您可以在M+N
操作中完成,或者对于两组(每组1000个项目)大约2000次:
var setA = new HashSet<int>(listA);
foreach (var b in listB) {
if (setA.Contains(b)) {
...
}
}
LINQ库允许您在更少的代码行中完成这项工作:
foreach (var ab in listA.Intersect(listB)) {
...
}
如果不需要更改列表,则应该使用foreach
循环。
foreach (var itemA in A)
{
foreach (var itemB in B)
{
if (itemA == itemB) {}
}
}
如果确实需要更改列表,则应使用for
循环。
for (var i = 0; i < A.Count; i++)
{
for (var j = 0; j < B.Count; j++)
{
if (A[i] == B[j]) {}
}
}
如果对这两个列表进行排序,您可以通过按顺序浏览列表来更有效地完成此操作。
int i = 0;
int j = 0;
while (A.Length <= i && B.Length <= j)
{
if (A[i] == B[j])
{
// items are equal
i++;
j++;
}
else if (A[i] > B[j]) // Comparison of the ordered value, could be a property on the item.
{
j++; // increment B's counter
}
else
{
i++; // increment A's counter
}
}