我的应用程序中存在一些不良的性能问题。其中一项重大操作是比较字符串。 我下载了一个字符串列表,大约1000 - 10000.这些都是唯一的字符串。 然后我需要检查数据库中是否已存在这些字符串。 我正在使用的linq查询如下所示:
IEnumerable<string> allNewStrings = DownloadAllStrings();
var selection = from a in allNewStrings
where !(from o in context.Items
select o.TheUniqueString).Contains(a)
select a;
我做错了什么或者如何使用Linq更快地完成这个过程?
感谢。
答案 0 :(得分:1)
您确实为allNewStrings
中的每个元素查询了相同的唯一字符串1000 - 10000次,因此效率极低。
尝试分别查询唯一字符串,以便执行一次:
IEnumerable<string> allNewStrings = DownloadAllStrings();
var uniqueStrings = from o in context.Items
select o.TheUniqueString;
var selection = from a in allNewStrings
where !uniqueStrings.Contains(a)
select a;
现在您可以看到最后一个查询可以使用Except
编写,这对于像您的示例这样的集合运算符更有效:
var selection = allNewStrings.Except(uniqueStrings);
答案 1 :(得分:1)
另一种解决方案是使用HashSet
:
var set = new HashSet<string>(DownloadAllStrings());
set.ExceptWith(context.Items.Select(s => s.TheUniqueString));
set
现在将包含不在数据库中的字符串。