Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中比较列表并返回匹配项#_C#_List_Compare_Match - Fatal编程技术网

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

C# 在c中比较列表并返回匹配项#,c#,list,compare,match,C#,List,Compare,Match,比较两个列表并返回匹配项的最快和最好的方法是什么。 只有一个匹配是可能的。列表1包含来自数据库的动态数据 我现在的做法是: foreach (var item1 in List1) { foreach (var item2 in List2 ) { if(item2 == item1) string match = item1; } } 我觉得可以做得更快。使用 不确定它比当前代码快多少,可以使用秒表测量。但是在当前的代码中,您应该在查找匹配项时打

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

我现在的做法是:

foreach (var item1 in List1)
{
   foreach (var item2 in List2 )
   {
       if(item2 == item1)
       string match = item1;
   }
}
我觉得可以做得更快。

使用

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

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

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

  • 你能做的第一件事是有一个排序的列表
  • 然后,如果知道列表的中间值,就可以从头到尾遍历列表
  • 但大多数情况下,只要返回您的价值,因为您已经找到了它
此外,前2点仅在您的列表中有一些数字值时有效,您可以依靠这些数值来识别项目

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

Foreach (var item1 in List1)
{
   Foreach (var item2 in List2 )
   {
       if(item2 == item1) return item1;
   }
}
如果您真的需要这个例程非常快,那么您必须根据列表中的数据进行优化

另外,如果两个列表中的数据都是
string
,则可以为每个字符串生成一个hashcode(
string.GetHashCode
),然后依靠hashcode在列表中进行排序和搜索

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

  • 列表中的数据量(如果只有100个元素,则不会有太多性能提升)
  • 如果您的列表是静态的还是动态的
  • 如果它们是动态的,它们可以改变的频率
  • 您多久在这些列表中搜索一次

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


@哈比卜,是更快还是更简洁?我的意思是,它在内部做同样的剪贴吗?@tariq,是的,它在内部做循环,我不确定它是否更快,这就是为什么我提供了另一个选项,使用问题中修改过的代码。Linq平均会更慢,因为即使找到匹配项,它也会继续迭代。第二个代码示例将是最快的。@MatthewWatson,是的,这是正确的,因为
Intersect
将首先收集所有相交的元素,然后首先应用
这并没有可能的那么快。它正在对
match!=外部循环内为空。如果您只是从内部循环返回,您将避免在外部循环的每次迭代中在外部循环中进行比较。(例如,见我的答案。)考虑到问题要求的是“最快的方式”,这并不是最快的方式。
Foreach (var item1 in List1)
{
   Foreach (var item2 in List2 )
   {
       if(item2 == item1) return item1;
   }
}
foreach (var item1 in List1)
    foreach (var item2 in List2)
        if (item2 == item1)
            return item1;

return null;