Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ查询的优化_C#_Linq_Optimization_Query Optimization_Contains - Fatal编程技术网

C# LINQ查询的优化

C# LINQ查询的优化,c#,linq,optimization,query-optimization,contains,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。这将大大有助于内存的使用,特别是如果您可以在程序的API表面

有没有办法优化以下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
。这将大大有助于内存的使用,特别是如果您可以在程序的API表面上进一步传播更改的话。在任何确实需要数组的地方,在函数调用之后调用
.ToArray()
都很容易,但是。。。这样做的次数越少,保存阵列分配和复制的可能性就越大

public static IEnumerable<Test> GetObjects(IEnumerable<Test> t, IEnumerable<int> ids)
{
    return t.Where(q => ids.Contains(q.Id));
}
或者更好,因此您可能会重新使用hashset,或者首先将
ids
集合构建为hashset:

public static IEnumerable<Test> GetObjects(IEnumerable<Test> t, HashSet<int> ids)
{
    return t.Where(q => idHash.Contains(q.Id));
}
公共静态IEnumerable GetObjects(IEnumerable t,哈希集ID)
{
返回t.Where(q=>idHash.Contains(q.Id));
}

在数据库世界中,我知道您也可以通过首先对
ids
集合进行排序来优化这一点,但我不确定.Net和linq现在能够利用iorderenumerable是什么样子。

您是否真的遇到了性能问题,或者只是在猜测?我认为在这项任务中,你不能比O(n^2)做得更好。你可以尝试将
Test
s存储在字典中,使用它们的ID作为键,我想…ID必须是数组吗?例如,如果您可以将
ids
更改为
HashSet
,则效率会高得多。注意:我不建议做像
var hash=newhashset(id)这样的事情在方法内部-应该在方法外部执行一次,并在使用数组的相同位置重用相同的哈希。或者,正如@Sweeper所指出的:
字典
由id键控-再次重复使用,而不是每次执行ToArray()时都计算,您实际上与列表中的所有元素进行了交互,即使您还不需要。您可以使用IEnumerable,查询将在您真正需要的时候进行。对于性能优化问题,与往常一样,如果这有帮助的话,我想看看前后的数字。
public static IEnumerable<Test> GetObjects(IEnumerable<Test> t, HashSet<int> ids)
{
    return t.Where(q => idHash.Contains(q.Id));
}