Является ли Linq "Где" дороже, чем Linq "Селект"? - PullRequest
3 голосов
/ 15 января 2010

Я исследую производительность на операции. Я перебираю подмножество предметов из коллекции. Я фильтрую эту коллекцию, используя запрос Linq. В основном это выглядит так:

var filteredItems = items.Where(x => x.PropertyToFilterOn == filterValue);
foreach (var filteredItem in filteredItems)
{
    // do something to the filtered item
}

Если я использую Select вместо Where, я получаю то же самое. Что лучше использовать и в чем разница?

Ответы [ 3 ]

9 голосов
/ 15 января 2010

Где и Выберите, конечно, не достичь того же самого.

Where фильтрует перечислимое на основе предиката. Результат вызова Где на IEnumerable<T> равен IEnumerable<T>.

Select является проекцией - она ​​позволяет отображать перечисляемое, например, для выбора только подмножества свойств перечислимого типа, или создавать другой объект полностью на основе значений перечислимого типа.

И где, и в выборке есть не менее O (n) - поскольку каждый элемент в перечислении должен быть посещен для выполнения проекции или фильтра.

Отличным справочником является следующий документ о стандартных операторах запросов.

http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/standard_query_operators.doc

5 голосов
/ 15 января 2010

Where фильтры, Select карты. Две совершенно разные вещи.

2 голосов
/ 15 января 2010

Сравните, как теоретически будет работать фоновый код:

// Where
foreach(var x in items)
{
    if (x.PropertyToFilterOn == filterValue)
        yield return x;
}

// Select
foreach (var x in items)
{
    yield return selector(x);
}

Итак, обратите внимание, разница в производительности зависит от сложности данного делегата селектора. Но, как говорили другие, они служат различным целям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...