There must是一个更好的方法来做到这一点,我确信......
// Simplified code
var a = new List<int>() { 1, 2, 3, 4, 5, 6 };
var b = new List<int>() { 2, 3, 5, 7, 11 };
var z = new List<int>();
for (int i = 0; i < a.Count; i++)
if (b.Contains(a[i]))
z.Add(a[i]);
// (z) contains all of the numbers that are in BOTH (a) and (b), i.e. { 2, 3, 5 }
我不介意使用上述技术,但我想要快速高效的东西(我需要多次比较非常大的 Lists ),而这似乎两者都不是!有什么想法吗?
编辑:因为它有所不同 - 我正在使用 .NET 4.0,初始数组已经排序并且不包含重复项。
您可以使用 IEnumerable.Intersect。
var z = a.Intersect(b);
这将probably比您当前的解决方案更有效。
请注意,您遗漏了一条重要信息 - 列表是否恰好是有序的。如果它们是几个嵌套循环,每个输入数组只传递一次,每个循环可能会更快 - 并且编写起来会更有趣。
Edit针对您对订购的评论:
第一次尝试循环 - itwill需要对您进行一些调整,但适用于您的初始数据。
int j = 0;
foreach (var i in a)
{
int x = b[j];
while (x < i)
{
if (x == i)
{
z.Add(b[j]);
}
j++;
x = b[j];
}
}
这是您需要添加一些单元测试的地方;)
Edit最后一点 - Linq 很可能可以使用 SortedList 非常有效地执行此交集,如果性能是一个问题,那么值得测试各种解决方案。如果您以无序方式加载数据,请不要忘记考虑排序。
最后一次编辑因为这方面有一些反复,人们可能会在没有正确调试的情况下使用上面的内容,所以我在这里发布了更高的版本:
int j = 0;
int b1 = b[j];
foreach (var a1 in a)
{
while (b1 <= a1)
{
if (b1 == a1)
z1.Add(b[j]);
j++;
if (j >= b.Count)
break;
b1 = b[j];
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)