LINQ-запрос, возвращающий все исходные объекты


Я просто рефакторинг кода я столкнулся во время исправления ошибки, а просто хотели быстрый проверочной, чтобы убедиться, что я не хватает какой-либо причине, за то, что я собираюсь удалить.

Текущий код:

uxButton.Enabled = ((from a in actions select a).Distinct().Count() == 1);

Там действительно не нужен LINQ-запроса, так:

uxButton.Enabled = actions.Distinct().Count() == 1;

Следует сделать трюк, верно?



621
2
задан 19 июля 2011 в 08:07 Источник Поделиться
Комментарии
3 ответа

Как и другие ответы изложили свои приведенный код делает то же самое, но может дать проблемы с производительностью для больших коллекций, так как вся коллекция проходится при вызове функции count().

Следующий код должен решить эту проблему:

var distinct = actions.Distinct();
uxButton.Enabled = distinct.Take( 2 ).Count() == 1;

Возможно, вы могли бы превратить это в метод расширения:

uxButton.Enabled = actions.Distinct().CountOf( 1 );


Ему казалось полезным, поэтому я добавил его к моей библиотеке, наряду с модульного тестирования.

/// <summary>
/// Returns whether the sequence contains a certain amount of elements.
/// </summary>
/// <typeparam name = "T">The type of the elements of the input sequence.</typeparam>
/// <param name = "source">The source for this extension method.</param>
/// <param name = "count">The amount of elements the sequence should contain.</param>
/// <returns>
/// True when the sequence contains the specified amount of elements, false otherwise.
////</returns>
public static bool CountOf<T>( this IEnumerable<T> source, int count )
{
Contract.Requires( source != null );
Contract.Requires( count >= 0 );

return source.Take( count + 1 ).Count() == count;
}

2
ответ дан 19 июля 2011 в 03:07 Источник Поделиться

Они оба делают то же самое. Первый просто выглядит странно. Похоже, автор просто не понимает технологии LINQ.

Я не уверен, почему вы проверяете, чтобы увидеть, если счетчик равен 1. Похоже, в этой ситуации

uxButton.Enabled = actions.Distinct().Any()

было бы более целесообразно и более производительным.

0
ответ дан 19 июля 2011 в 01:07 Источник Поделиться

Да, вы правы, запросы LINQ это лишнее и можно просто писать действия , а не.

Единственное замечание, я бы о коде, что .Различны().Функция count() будет проходить через всю коллекцию, но вы можете остановиться, когда не отдельный элемент не найден. Так что лично я бы вместо этого используйте:

uxButton.Enabled = actions.Distinct().Skip(1).Any();

-1
ответ дан 19 июля 2011 в 01:07 Источник Поделиться