Подсчет количества точек, которые имеют как большую тету, так и больший радиус, чем заданная точка

Мне не нравится тот факт, что я выбираю все точки, хотя я только забочусь о их количестве.

Какая из частей from должна отображаться первой, если это имеет значение?

var count = (from type in ValidTypes()
    from point in GetData(type)
    where point.Radius > referencePoint.Radius
        && point.Theta > referencePoint.Theta
    select point).Count()

ValidTypes() возвращает несколько типов, около 5.

GetData(type) может возвращать много точек, возможно, 100 000.

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

Есть ли способ записать это быстрее или более читабельным?

12 голосов | спросил mjcopple 21 Jpm1000000pmFri, 21 Jan 2011 22:10:07 +030011 2011, 22:10:07

4 ответа


8

Сначала ваш запрос написан отлично. Его структура не вызывает беспокойства; порядок ofs явно правильный, выбор является подходящим. Там, где вы могли бы искать улучшения, которые могли бы изменить запрос (код и, возможно, производительность), были бы в методе GetData. Если, например, GetData есть получение данных из внешнего, запрашиваемого источника, то вы можете захотеть разгрузить фильтрация на it вместо того, чтобы получать все точки данных и фильтровать их внутри вашего приложения, особенно потому, что у вас так много точек данных (потенциально). Возможно, ваш запрос мог бы быть

(from type in ValidTypes()    
 select GetData(type, referencePoint).Count())
.Sum();

// or same meaning, different phrasing

(from type in ValidTypes()
from point in GetData(type, referencePoint)
select point).Count();
ответил Anthony Pegram 21 Jpm1000000pmFri, 21 Jan 2011 23:22:39 +030011 2011, 23:22:39
7

Почему вы делаете:

Point.Radius > referencePoint.Radius && point.Theta > referencePoint.Theta

Кажется, что это, вероятно, должна быть функция вроде IsCorrectReferencePoint или еще что-то. Это сделает ваш код более понятным и понятным, поскольку вы можете просто посмотреть имя функции, чтобы увидеть, что она делает.

ответил Homde 23 Jpm1000000pmSun, 23 Jan 2011 15:26:04 +030011 2011, 15:26:04
3

Это старый вопрос, но, возможно, стоит упомянуть людей, что .Count () имеет полезную перегрузку. Повторная запись запроса в свободном синтаксисе может позволить вам написать:

int count = ValidTypes()
    .SelectMany(type => GetData(type))
    .Count(point => point.Radius > referencePoint.Radius 
                 && point.Theta > referencePoint.Theta);
ответил Marty Neal 31 MaramSat, 31 Mar 2012 02:50:04 +04002012-03-31T02:50:04+04:0002 2012, 02:50:04
2

Мне не нравится писать инструкцию, которая сочетает в себе как «беглое», так и «выражение» синтаксис для LINQ. (См. SO: Какой синтаксис LINQ вы предпочитаете? Свободное выражение или выражение запроса )

Я также выбрал бы несколько предложений where над одним where с помощью &&. Итак, либо:

var points = from type in ValidTypes()
    from point in GetData(type)
    where point.Theta > referencePoint.Theta
    where point.Radius > referencePoint.Radius
    select point;

var count = points.Count();

или

var count = ValidTypes
    .Select(type => type.GetData())
    .Where(point.Theta > referencePoint.Theta)
    .Where(point.Radius > referencePoint.Radius)
    .Count();

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

ответил Jay Bazuzi 29 Jam1000000amSat, 29 Jan 2011 02:06:47 +030011 2011, 02:06:47

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132