LINQ查询的优化

时间:2018-11-12 16:50:29

标签: c# linq optimization query-optimization contains

有没有一种方法可以优化以下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();
}

1 个答案:

答案 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。