6

比较 2 个列表并返回匹配项的最快和最佳方法是什么。只有一场比赛是可能的。List1 包含来自数据库的动态数据。

我现在这样做的方式:

foreach (var item1 in List1)
{
   foreach (var item2 in List2 )
   {
       if(item2 == item1)
       string match = item1;
   }
}

我有一种感觉,它可以做得更快。

4

3 回答 3

13

使用Enumerable.Intersect

var matchItem = List1.Intersect(List2).First();

不确定您当前的代码有多快,您可以使用秒表测量它。但是在您当前的代码中,您应该在找到匹配项时打破您的内部和外部循环。就像是:

foreach (var item1 in List1)
{
    string match = null;
    foreach (var item2 in List2)
    {
        if (item2 == item1)
        {
            match = item1;
            break;
        }
    }
    if (match != null)
        break;
}
于 2013-05-08T07:38:53.860 回答
2

You can short-circuit the loops when you find any matches. You could then use a method that returns the item that matches, or null if none matched (assuming the elements are references types):

foreach (var item1 in List1)
    foreach (var item2 in List2)
        if (item2 == item1)
            return item1;

return null;
于 2013-05-08T07:42:50.360 回答
2

你有很多方法可以做到这一点。这主要取决于您要匹配的数据。

  • 您可以做的第一件事是拥有一个排序列表
  • 那么如果你知道列表的中间值,你可以从头到尾遍历你的列表
  • 但大多只是返回你的价值,因为你已经找到了

此外,前 2 点仅在您的列表有一些可以用来识别项目的数值时才有效。

您可以做的第一个优化是:

Foreach (var item1 in List1)
{
   Foreach (var item2 in List2 )
   {
       if(item2 == item1) return item1;
   }
}

如果您确实需要此例程非常快,则必须根据列表中的数据进行优化。

此外,如果您的数据string在两个列表中,您可以为每个字符串 ( string.GetHashCode) 生成一个哈希码,然后依靠哈希码在您的列表中进行排序和搜索。

还有许多其他方法,但这一切都取决于:

  • 您在列表中拥有的数据量(如果您只有 100 个元素,您不会看到很多性能提升)
  • 如果您的列表是静态的还是动态的
  • 如果它们是动态的,它们多久可以改变一次
  • 您多久在这些列表中进行一次搜索
  • ...
于 2013-05-08T07:41:48.247 回答