我需要过滤List<object>
,以便删除其他string
内部不存在List<string>
属性的所有项目。
我创建了这个控制台应用程序只是为了确保LINQ语法正确:
class FooBar
{
public int Id { get; set; }
public string ValueName { get; set; }
}
然后...
List<FooBar> foobars = new List<FooBar>
{
new FooBar { Id = 1,ValueName = "Val1" },new FooBar { Id = 2,ValueName = "Val2" },new FooBar { Id = 3,ValueName = "Val3" },new FooBar { Id = 4,ValueName = "Val4" }
};
List<string> myStrings = new List<string>
{
"Val1","Val3"
};
// Only keep records where ValueName is found in `myStrings`
foobars = foobars.Where(f => myStrings.Contains(f.ValueName)).ToList();
因此,这一行:
foobars = foobars.Where(f => myStrings.Contains(f.ValueName)).ToList();
恰好满足了我的要求,并且还给了我这两个记录:
{ Id = 1,ValueName = "Val1" }
{ Id = 3,ValueName = "Val3" }
很好。但是...在实际应用中,foobars
有超过200k项,而myStrings
有约190k。而当该LINQ行被执行时,最多需要5分钟才能完成。
我显然做错了什么。 20万条记录并不大。真正的FooBar
并不是那么复杂(没有嵌套对象,只有9个属性)。
这是怎么回事?