|
Оптимальный спосок склейки IEnumerable<string> в строку
|
|||
---|---|---|---|
#18+
Встала задача склеить IEnumerable<string> в одну строку с разделителем, но с небольшим условием: иеется параметр alias (string), если он пустой, или null, строку в IEnumerable оставляем как есть, если не пустой - склеиваем его со строкой, разделив точкой. Варианты решения задачи: Enumerable.Aggregate, string.Concat, string.Join, StringBuilder. Доп. варианты для склеивания алиаса, строки[, и разделителя]: string.Format, string.Concat, конкатениция через операцию сложения. Набросал вот такие тесты Код: 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156.
Результаты: Код: 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. 26. 27. 28. 29. 30. 31.
Что удивило - это то, что вариант 3 (StringBuilder и string.Concat(object, object, object)) оказался быстрее варианта 1 (string.Concat(IEnumerable<T>) и string.Concat(object, object, object)) - ведь реализация string.Concat(IEnumerable<T>) тоже внутри использует StringBuilder: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Ну, и где-то тут уже пробегало, что для коротких строк и небольшого количества конкатенаций склеивание строк операцией + бывает эффективнее, чем использование string.Format (вариант 6, StringBuilder.Append(string+T+string)). Есть ли какой-нибудь более оптимальный метод, чем вариант 3 (StringBuilder и string.Concat(object, object, object))? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 10:24 |
|
Оптимальный спосок склейки IEnumerable<string> в строку
|
|||
---|---|---|---|
#18+
WinterGraveyard, под оптимальностью понимается только время? Количество потребляемой памяти и количество сборок мусора не важны? Что дальше делается со склееной строкой? Она нужна для обработки в коде или пишется куда-то в поток? Можно сразу писать в цикле в поток без склейки. А если вместо Код: c# 1.
написать Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 10:49 |
|
Оптимальный спосок склейки IEnumerable<string> в строку
|
|||
---|---|---|---|
#18+
petalvikWinterGraveyard, под оптимальностью понимается только время? Количество потребляемой памяти и количество сборок мусора не важны? На самом деле в контексте решаемой задачи и время роли не играет - сцепляемые последовальности не особенно длинные (на больше 100 элементов). Просто я решил этот кейс разобрать в теоретическом плане - в дальнейшем может пригодиться. Ну, и просто интересно. А поскольку интерес теоретический, то я решил привязаться хотя бы ко времени отработки. petalvikЧто дальше делается со склееной строкой? Она нужна для обработки в коде или пишется куда-то в поток? Можно сразу писать в цикле в поток без склейки. Нет, сцепленная строчка просто отображается в UI. petalvikА если вместо Код: c# 1.
написать Код: c# 1.
Да, так еще лучше - 61029789 тиков. Пока самый оптимальный вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.03.2015, 11:01 |
|
|
start [/forum/topic.php?fid=20&msg=38920811&tid=1401736]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 333ms |
total: | 455ms |
0 / 0 |