有没有办法优化以下 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();
}
最佳答案
不要返回数组。使用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 是什么样子。
关于c# - LINQ查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53266681/