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

时间:2013-05-08 07:37:11

标签: c# list compare match

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

我现在这样做的方式:

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

我觉得它可以更快地完成。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

  • 你可以做的第一件事就是有一个排序列表
  • 然后,如果你知道列表的中间值,你可以从结尾开始遍历你的列表
  • 但大部分只是在你找到它之后才返回你的价值

前2个点只有在您的列表有一些数字值时才能使用,您可以依赖它来识别项目。

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

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

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

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

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

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

答案 2 :(得分:1)

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

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

return null;