比较列表并返回c#中的匹配项

本文关键字:列表 返回 比较 | 更新日期: 2023-09-27 18:12:30

比较两个列表并返回匹配的最快和最好的方法是什么?只有一个匹配是可能的。列表1包含来自数据库的动态数据。

我现在的做法:

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

我觉得这件事可以做得更快。

比较列表并返回c#中的匹配项

使用Enumerable.Intersect。

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

不确定它比你当前的代码快多少,你可以使用Stopwatch来测量它。但是在当前的代码中,您应该在查找匹配时打破内部循环和外部循环。比如:

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

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

  • 首先你要做的是有一个排序列表
  • 那么如果你知道列表的中间值你就可以从开始到结束遍历列表
  • 但大多数情况下只是返回你的值,因为你已经找到了

前两点只有在你的列表有一些数字值,你可以依靠它来识别一个项目时才有效。

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

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

如果你真的需要这个例程非常快,你就必须根据列表中的数据进行优化。

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

有很多其他的方法,但这都取决于:

  • 列表中的数据量(如果你只有100个元素,你不会看到很多性能提升)
  • 如果你的列表是静态的或动态的
  • 如果它们是动态的,它们可以多久改变一次
  • 您多久在这些列表中进行一次搜索

您可以在找到任何匹配时短路循环。然后可以使用一个方法返回匹配的项,如果没有匹配则返回null(假设元素是引用类型):

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