2014-12-15 11 views
0
List<MyClass> options = new List<MyClass>(); 
foreach (MyClass entity in ExistingList) { 
    if (entity.IsCoolEnough) { 
     options.Add(entity); 
    } 
} 

Мне просто интересно, какой самый быстрый и эффективный способ сделать это. Список не очень велик, но он работает часто, поэтому я хотел бы сохранить его быстро. Я тоже не ищу изменения в многословии. Я просто хочу, чтобы время работы было как можно быстрее.Эффективно собирать список объектов

+0

Насколько велика «не очень большой», и как часто «часто»? Если его очень маленький список, запустите каждую секунду, неважно, попытаетесь ли вы его оптимизировать. С другой стороны, если это несколько милей и несколько тысяч предметов, это еще одна история. –

+0

Предполагая, что 'ExistingList' часто меняется, было бы целесообразно рассмотреть возможность выбора на основе' IsCoolEnough' уже при построении 'ExistingList'. Таким образом, эта процедура дополнительного отбора не нужна вообще. Самый эффективный код - тот, который никогда не запускается ;-) – lzydrmr

ответ

7

Ну, с помощью LINQ он читает более интуитивно:

var options = (from e in ExistingList where e.IsCoolEnough select e).ToList(); 

Я не уверен, является ли это быстрее и эффективнее, хотя.

Я бы сказал, что для небольших списков это на самом деле какая-то чрезмерная оптимизация, как и для коротких списков, foreach, for и вышеприведенный подход не должен иметь никакого значения. Поэтому вместо того, чтобы оптимизировать это, сначала проверьте, не накладывает ли он вообще проблемы времени выполнения.

+6

Не забудьте прокомментировать нижний предел? –

+0

Это отличный пример - и совет тоже твердый. Я пытался быть упреждающим и избегать замедления, но, ожидая, действительно ли это проблема, вероятно, лучше всего. Благодаря! – jtsmith1287

0

Я вижу два возможных варианта «общей» оптимизации, будь то на уровне дБ или уровне модели, в зависимости от того, где находится ресурс.

Если вы можете выбрать через где на IsCoolEnough в дб уровня:

var result = ExistingList.Where(e => e.IsCoolEnough) // still in db? 
         .ToList(); // enumerate 

Если вы не можете и дорогостоящая операция IsCoolEnough:

var result = new ConcurrentBag<MyClass>(); // Thread safe but unordered. 
Parallel.ForEach(ExistingList, current => 
      { 
       if (current.IsCoolEnough) result.Add(current); 
      }); 

Это невозможно для меня, чтобы дать более солидные советы, учитывая совершенно неизвестные требования. Но у вас нет общих «недостатков» в вашей реализации.

I like referring to this article, so I'm doing that again now. It's worth the read (Ie click somewhere on/in this line/sentence, it's a link).

Смежные вопросы