有没有一种方法可以优化以下LINQ查询?数组大时效率不高。
public class Test
{
public int Id { get; set; }
}
public static Test[] GetObjects(Test[] t, int[] ids)
{
return t.Where(q => ids.Contains(q.Id)).ToArray();
}
答案 0 :(得分:2)
不返回数组。使用IEnumerable<Test>
。这将大大有助于内存的使用,特别是如果您可以在程序的API界面中进一步传播更改的话。在您确实需要数组的任何地方,在函数调用之后调用.ToArray()
都很容易,但是同样,您做的次数越少,保存一个数组的可能性就越大。数组分配和复制。
public static IEnumerable<Test> GetObjects(IEnumerable<Test> t, IEnumerable<int> ids)
{
return t.Where(q => ids.Contains(q.Id));
}
您可以通过将ids
变量转换为HashSet<int>
来进一步改进。这是否有帮助取决于集合的大小:
public static IEnumerable<Test> GetObjects(IEnumerable<Test> t, IEnumerable<int> ids)
{
var idHash = new HashSet<int>(ids);
return t.Where(q => idHash.Contains(q.Id));
}
甚至更好,因此您有可能首先重复使用哈希集或首先将ids
集合构建为哈希集:
public static IEnumerable<Test> GetObjects(IEnumerable<Test> t, HashSet<int> ids)
{
return t.Where(q => idHash.Contains(q.Id));
}
在数据库世界中,我知道您也可以通过首先对ids
集合进行排序来优化此设置,但是我不确定.Net和linq现在能够利用IOrderedEnumerable。