Оптимизация запроса LINQ - PullRequest
0 голосов
/ 12 ноября 2018

Есть ли способ оптимизировать следующий запрос 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 голосов
/ 12 ноября 2018

Не возвращать массив.Используйте IEnumerable<Test>.Это очень поможет с использованием памяти, особенно если вы можете распространять это изменение дальше по всей поверхности API вашей программы.В любом месте, где вам действительно нужен массив, достаточно просто вызвать .ToArray() после вызова функции, но опять же ... чем меньше вы это делаете, тем больше вероятность того, что вы сохраните распределение массива иcopy.

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.

...