比较列表并返回c#中的匹配项
本文关键字:列表 返回 比较 | 更新日期: 2023-09-27 18:12:30
比较两个列表并返回匹配的最快和最好的方法是什么?只有一个匹配是可能的。列表1包含来自数据库的动态数据。
我现在的做法:
foreach (var item1 in List1)
{
foreach (var item2 in List2 )
{
if(item2 == item1)
string match = item1;
}
}
我觉得这件事可以做得更快。
使用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;