【发布时间】:2016-03-07 20:44:34
【问题描述】:
我有一个对象列表,我希望将其缩减为仅具有包含在单独列表中的属性的对象。
List1 是一个简单字符串的列表。
List2 是包含两个字符串属性的对象列表; A 和 B。
A 和 B 不存在于 List1 中的所有项目都应删除。
这个过程非常依赖时间,需要尽可能快。 目前我有以下实现;
var List1 = new List<String>() {"Around", "9000", "strings"}; //List of about 9000 strings
var List2 = databaseList.ToList(); //Around 2.5 million objects
var reducedList = new HashSet<Object>();
foreach (var item in List2)
{
if(List1.Contains(item.A) && List1.Contains(item.B))
{
reducedList.Add(item);
}
}
这个过程大约需要 7 秒才能完成,这对于我目前的要求来说太慢了。
我尝试使用 LINQ 运行它,但结果相同,大约 7 秒。
var reducedList = List2.Where(r => List1.Contains(r.A)).Where(r => List1.Contains(r.B)).ToList();
有什么建议可以改善这一点吗?
编辑: 我无法在 SQL 方面执行此操作,因为我需要比较的 9000 个字符串无法“翻译”成 SQL 查询,但会超出我们 SQL Server 中允许的 2100 个输入参数设置。
【问题讨论】:
-
just 对数据库中的所有项目执行
foreach需要多长时间?您是在计时foreach循环,还是两个初始化语句? -
databaseList 上的 foreach 包含超过 250 万个对象,这让我很困扰;还给出了名称(databaseList),您确定不能在数据库级别进行查询吗?
-
List1 的大小是多少,真的是“大约 9000 个字符串”吗?它也来自 db 吗?
-
我认为这是第二行(执行 db-query 并从 db 加载所有对象)一直用完。您需要那里的完整对象/行吗?如果没有,请使用投影仅加载所需的列,从而加快查询速度。