|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
Как выбрать из "list2" только те значение Id, которых равно list1 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2013, 18:47 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
2king2, Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2013, 20:20 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
petalvik2king2, Код: c# 1.
Спасибо, но немного не так нужно. На выходе должен появиться список List<MyObj> Т.е. если var list1 = new List<string> {"5"," 1 ","8","10"}; я удалю "1", то на выходе должен получиться List<MyObj> содержащий только Код: c# 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2013, 22:33 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
Вот получился громоздкий код, который выдает то что надо, но хочеться найти более элегантный подход Код: c# 1.
У кого-нибудь есть мысли на этот счет? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.10.2013, 22:50 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
Код: c# 1.
либо снести громоздкость в Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 00:10 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LR, Спасибо! Вроде не плохо выглядит :) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 15:30 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
Код: c# 1.
P.S. LR, совет: уходи от реализаций в сторону абстракций. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 15:48 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
МСУ, Согласен, в данном случае в Join-е есть все необходимое для "элегантного" кода! Однако же, нужно учесть что Exists традиционно весьма шустр, и в подобной задаче может оказаться более производительным чем Join... P.S. за совет спасибо, впал в "медитацию" над вопросом "мое мышление больше конкретное или абстрактное?"))) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 17:23 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRвпал в "медитацию" Ну впадать не нужно, конечно :) Но от подобных реализаций в методах а-ля List<T> и иже нужно, конечно, избавляться как от сорняка. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 18:01 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
МСУНо от подобных реализаций в методах а-ля List<T> и иже нужно, конечно, избавляться как от сорняка. Ну тут я не согласен. В определенном случае рассматриваемой задачи (элементов в list2 мало, в list1 много) Where-Exists даст лучшую производительность чем Join (в других случаях, конечно, сильно проиграет). Более того, если производительность критична, нет ничего зазорного в том, чтобы отказаться от линкью-методов и прописать свой "громоздкий" метод-расширение. Другими словами, не бывает общих (абстрактных) лучших решений, зато бывают лучшие конкретные решения (реализации). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 19:38 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRWhere-Exists даст лучшую производительность чем Join Замеры перформанса в студию. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 20:45 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
МСУЗамеры перформанса в студию. Пожалуйста list1.Count=80, list2.Count=4Exists: results.Count=1, Ticks=8595 Join: results.Count=1, Ticks=9551 GetByIds: results.Count=1, Ticks=7056 или list1.Count=4, list2.Count=73Exists: results.Count=1, Ticks=7729 Join: results.Count=1, Ticks=8557 GetByIds: results.Count=1, Ticks=5824 соответственно при больших количествах Join уверенно опережает list1.Count=79, list2.Count=81Exists: results.Count=34, Ticks=12335 Join: results.Count=34, Ticks=8531 GetByIds: results.Count=34, Ticks=7928 все более list1.Count=1275, list2.Count=1278Exists: results.Count=802, Ticks=592922 Join: results.Count=802, Ticks=13432 GetByIds: results.Count=802, Ticks=452105 и более list1.Count=12607, list2.Count=12671Exists: results.Count=7971, Ticks=49551781 Join: results.Count=7971, Ticks=51876 GetByIds: results.Count=7971, Ticks=39067865 GetByIds - самый простецкий вариант альтернативы методам линкью: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.10.2013, 23:33 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRсоответственно при больших количествах Join уверенно опережает Как-то ты лихо съехал с темы... Кто давеча писал, что LRWhere-Exists даст лучшую производительность чем Join LRExists традиционно весьма шустр, и в подобной задаче может оказаться более производительным чем Join... ? Во-вторых, принято код замеров тоже прикладывать. На будущее. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 00:05 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
6342Что было понятно и без "замеров" Where-Exists дает лучшую производительность чем Join в очень "узком" случае list1.Count=63171, list2.Count=4Exists: results.Count=3, Ticks=78330 Join: results.Count=3, Ticks=261978 GetByIds: results.Count=3, Ticks=55179 Но "замеры" показали, что и в таком "узком" случае производительность Join проседает не смертельно, а вот производительность Where-Exists в других случаях проседает таки смертельно... Второе "открытие", это то, что даже достичь производительности Join (в общем случае) прописывая свой "громоздкий метод", пожалуй, очень непросто, т.е. методы линкью достаточно хорошо оптимизированы (и это радует). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 00:34 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
МСУLRсоответственно при больших количествах Join уверенно опережает Как-то ты лихо съехал с темы... Кто давеча писал, что LRWhere-Exists даст лучшую производительность чем Join LRExists традиционно весьма шустр, и в подобной задаче может оказаться более производительным чем Join... ? Во-вторых, принято код замеров тоже прикладывать. На будущее. LRВ определенном случае рассматриваемой задачи (элементов в list2 мало, в list1 много) Where-Exists даст лучшую производительность чем Join (в других случаях, конечно, сильно проиграет). Будьте более внимательны. На будущее. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 00:38 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRWhere-Exists дает лучшую производительность чем Join в очень "узком" случае Этот вывод был сделан только после моего пинка . До этого ты козырял методом Exists как самым быстрым и лучшим. Твои "узкие" случаи на практике идут в топку, т.к. писать "супер быстрый" код для 3 элементов списке - маразм. Если есть возможность использовать Join/GroupJoin - используй его. LRНо "замеры" показали, что и в таком "узком" случае производительность Join проседает не смертельно Не смеши мои тапочки. "Смертельность" для 3 элементов в коллекции имеет нулевой смысл даже для того, чтобы об этом думать. LRа вот производительность Where-Exists в других случаях проседает таки смертельно... Поэтому прежде чем что-то утверждать, нужно сначала хотя бы проверить. LRБудьте более внимательны. На будущее. По делу, как я понимаю, всё? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 08:40 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
МСУ Теперь понятно, что из этого LRВ определенном случае рассматриваемой задачи (элементов в list2 мало, в list1 много) Where-Exists даст лучшую производительность чем Join (в других случаях, конечно, сильно проиграет). сделано это МСУLRсоответственно при больших количествах Join уверенно опережает Как-то ты лихо съехал с темы... Кто давеча писал, что LRWhere-Exists даст лучшую производительность чем Join вовсе не из-за невнимательности, как можно было бы предположить, а вполне намеренно. Что ж, каждому свое. Но скучное ж это дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 12:37 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRЧто ж, каждому свое. Но скучное ж это дело. Просто ты несколько раз повторил про какую-то там производительность Exists. Ну на первый раз я промолчал, думаю, не буду влезать в дебаты по экономии спичек на спичечной фабрике, но потом уж прости, но потребовал замеры. Собственно, того и следовало ожидать, Join рулит. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.10.2013, 14:33 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
МСУСобственно, того и следовало ожидать, Join рулит. Собственно, того и следовало ожидать, Join рулит не всегда . В мсскл применяется один из трех алгоритмов Join - Nested loops, Merge, Hash , в зависимости от ситуации (выбирает оптимизатор или можно указать хинтом). В linq2obj применяется лишь один - Hash, т.к. нет статистики для выбора Nested loops (количество элементов IEnumerable неизвестно) и нет индексов для Merge. Но ситуации, где оптимальней Nested loops ("If one join input is small (fewer than 10 rows) and the other join input is fairly large...") или Merge ("If the two join inputs are not small but are sorted on their join column...") могут быть обусловлены самой постановкой задачи. Тогда есть смысл задуматься над реализацией соответствующего алгоритма. P.S. Where-Exists по сути как раз и есть неким подобием Nested loops, потому и выигрывает на малых количествах outer-списка ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 01:38 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRP.S. Where-Exists по сути как раз и есть неким подобием Nested loops, потому и выигрывает на малых количествах outer-спискаВ базе nested loop обычно идёт в комбинации с index seek . ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 13:41 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
Алексей КВ базе nested loop обычно идёт в комбинации с index seek . Ну да, индексов нет, потому и "некое подобие":). Но общая схема отбора подходящих пар такая же "внешний цикл по outer-списку + внутренний по inner-списку", в отличие от схем Merge и Hash (см. например здесь ). Для случая, когда оба списка уже отсортированы должным образом и достаточно большие, вроде несложно реализовать Merge-алгоритм. Думается, это даст большой выигрыш, т.к. не надо будет тратить память и время на построение хэш-таблиц. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 18:26 |
|
Как выбрать из списка значения только те которые есть в в другом списке?
|
|||
---|---|---|---|
#18+
LRДля случая, когда оба списка уже отсортированы должным образом и достаточно большие, вроде несложно реализовать Merge-алгоритм. Думается, это даст большой выигрыш, т.к. не надо будет тратить память и время на построение хэш-таблиц.Попробовал вот такую реализацию: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25.
Оказалось, многое зависит от типа ключа. С типом int выигрыш есть всегда, и существенный, с типом string - только на больших количествах. Но это и понятно, сравнение строк дорогая операция. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2013, 20:28 |
|
|
start [/forum/topic.php?fid=20&msg=38431773&tid=1403851]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
42ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 162ms |
0 / 0 |