c# - LINQ查询优化

标签 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();
}

最佳答案

不要返回数组。使用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/

相关文章:

c# - 我的 web api 仅从 ajax 客户端给出 net::ERR_CONNECTION_RESET 错误

c# - 我怎样才能制作一个 pictureBox,当点击它时,它会在标签上显示一些文本?

c# - 如何对集合中所有对象的属性执行 .Max() 并返回具有最大值的对象

mysql - 如何在 MYSQL 中优化此查询?

c# - 在 C# 中重用数组

c - 优化程序 (c)

c# - Entity Framework - 创建导航属性

c# - 一个窗口中有 25 个 WPF 日历,打开窗口需要 5 秒

c# - Linq 连接上的 System.OutOfMemoryException

c# - LINQ(或伪代码)按邻近度对项目进行分组