2015-08-06 2 views
0

Предположим, у меня есть 3 списка (не более 10 в моем случае).C# быстрее конкатенировать списки, а затем фильтровать или фильтровать, а затем конкатенировать

List 1 has m elements 
List 2 has n elements 
List 3 has p elements 

Возможно дублирование. Мне нужно найти 10 первых элементов, которые соответствуют запросу (я знаю, как это сделать, это не вопрос).

  1. Быстро ли объединить 3 списка, а затем фильтровать?
  2. Или быстрее фильтровать 3 списка (3x10 элементов), а затем объединить. И затем снова фильтруйте, чтобы иметь последние 10 элементов, которые я хотел.

Я бы выбрал второй вариант, но я не 100%, потому что я не знаю стоимость конкатенации и стоимость фильтрации.

Спасибо за любые входные данные.

Edit: я могу иметь до 10 списков 100-1000 элементов => от 1000 элементов до 10000 элементов в объединенном списке.

В моем случае этот запрос может быть сделан от 3 до 5 раз в секунду на пользователя (но только раз в то время). Списки содержат контакты, а иногда пользователь ищет контакт. У меня есть запрос ajax, который отправляет каждый символ и обновляет таблицу.

+0

Do 'List1.Distinct(); List2.Distinct(); List3.Distinct(); 'для получения отдельных элементов из 3 списков – Karthik

+0

Я могу иметь дубликаты в объединенном списке, а не в списках. – Daniel

+0

Никто не сомкнул глаз, когда это было опубликовано: http: //stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array Я не вижу проблемы с ним он задал этот вопрос. Хотя этот вопрос был, очевидно, структурирован лучше, и он спросил «почему» не просто «есть». Они, по сути, и о производительности. – Adam

ответ

2

Потому что у меня нет 50 репутаций, но я не могу использовать комментарий. Извините парней.

Но, вопрос. В вашем первом случае вы выделите список размером с 3 списка. Если у вас ограничено память, это может быть плохой идеей.

Итак, вы соглашаетесь с 3 списками, а затем фильтруете этот большой список. 2 операции.

Во втором случае вам просто нужно обнаружить отдельные элементы в ваших 3 списках, доступ не так дорого. Я имею в виду, в чем разница между поиском в 3 списках или 1 списком?

+0

Наверно, это в вашем вопросе под уведомлением EDIT. –

+0

Какой вопрос вы говорите? –

+1

Да, извините. Должно быть, был дислексический момент: я думал, что ты почему-то задал вопрос. Неважно. –

5

Редактированный ответ: раньше у меня было мышление, потому что по какой-то причине я думал о «конкатенации», как о создании полного нового списка. (На самом деле, я знаю часть причины, потому что затраты на конкатенацию струн приходили на ум, но почему это было так, я не знаю).

Конечно, конкатенации в Linq не делает ничего подобного, так что выбор между:

list1.Concat(list2).Concat(list3) // ...and so on 
    .Where(yourFilter) 
    .Distinct() 
    .Take(10) 

И:

list1.Where(yourFilter) 
    .Concat(list2.Where(yourFilter)) 
    .Concat(list3.Where(yourFilter)) 
    .Distinct() 
    .Take(10) 

И разница между ними довольно интересно.

От простого взгляда на код здесь мы не ожидаем, что будет большая разница. Мы ожидаем, что у последнего будет недостаток в том, что он включает в себя несколько больше вызовов, но первый из них имеет недостаток в отношении дополнительных шагов интерфейса, участвующих в реализации Where, что более сложно, чем реализация Concat, и поэтому эти два баланса.Последний выглядит немного быстрее, хотя зависит от того, будут ли использоваться второй и/или третий Where (возможно, они не будут, если Take будет удовлетворен, прежде чем ударить их).

С списками в качестве источников, однако, последнее происходит довольно быстро, потому что Where оптимизирован для случая, когда источником является List<T>, и только последние извлекают выгоду из этой оптимизации за кулисами.

+0

Интересно, что если заданная задача достаточно велика, опция № 2 опциона выглядит скорее ('.SelectMany (li => li.Where (yourFilter)). Distinct(). Take (10)'). Вот доказательство, если я сделал это правильно: http://ideone.com/5tGVp9. Несмотря на это, набор задач OP настолько крошечный (30 элементов), что нет реальной разницы в производительности, и время было бы лучше потрачено, делая код читаемым. – mellamokb

+0

Спасибо за ответ. Я добавил некоторые вопросы в вопросы. – Daniel

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