我有一个ArrayList ids包含StringID的对象,另一个ArrayList objs包含具有字符串ID字段的对象.现在我有代码,找到ids没有匹配的代码,objs如下所示:
var missing = new List<string>();
foreach (MyObj obj in objs)
{
if (!ids.Contains(obj.ID))
{
missing.Add(obj.ID);
}
}
Run Code Online (Sandbox Code Playgroud)
这很好用.但是我把它重写为一个更好的"在LINQ中思考"的练习:
var missing = objs.Cast<MyObj>().Select(x => x.ID).Except(ids.Cast<string>());
Run Code Online (Sandbox Code Playgroud)
我期望这个LINQ比foreach+ Contains方法慢(特别是由于Cast调用),但LINQ的运行速度要快得多.什么是LINQ方法,以不同的方式提供性能优势?
LINQ在内部Except使用HashSet,具有O(1) Contains方法性能,当它为O(n)时ArrayList.这就是为什么它更快.
但蒂姆在评论中指出,你的Except方法并没有真正产生任何结果.它只是定义了一个查询.只要需要结果,就会执行查询.它可能会被执行多次.您应该添加ToList()调用以List<T>显式获取:
var missing = objs.Cast<MyObj>().Select(x => x.ID).Except(ids.Cast<string>()).ToList();
Run Code Online (Sandbox Code Playgroud)
那么,你为什么要使用ArrayList而不是泛型List<T>?