|
Многомерный массив в одномерный и обратно - расширяющий метод?
|
|||
---|---|---|---|
#18+
Если бы Array был дженериком, можно бы было сделать аналог такого Код: 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.
Только вместо T[,] на входе первого метода поставить Array и соответственно поменять типы во втором методе. Ну и поиграться с Rank внутри методов. Но поскольку Array не дженерик , то облом. У кого какие соображения по поводу того, как решить задачу? Практическое применение - сериализация. Проблема с ней, например, такая . ... |
|||
:
Нравится:
Не нравится:
|
|||
02.03.2014, 18:46 |
|
Многомерный массив в одномерный и обратно - расширяющий метод?
|
|||
---|---|---|---|
#18+
user7320, вот несколько соображений: -для копирования массивов используй Array.Copy -сериализацию можно например выполнить BinaryFormatter-ом ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 10:48 |
|
Многомерный массив в одномерный и обратно - расширяющий метод?
|
|||
---|---|---|---|
#18+
pationuser7320, вот несколько соображений: -для копирования массивов используй Array.Copy -сериализацию можно например выполнить BinaryFormatter-ом Спасибо, конечно... но, например, для XML-сериализации нужен именно одномерный массив. А копирование тут не причём - я просто перестраиваю порядок тех же самых элементов. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.03.2014, 14:48 |
|
Многомерный массив в одномерный и обратно - расширяющий метод?
|
|||
---|---|---|---|
#18+
user7320, то что тип Array не является generic не мешает написать обобщенное решение для конвертации из многомерного массива в одномерный. Хотя, конечно, если бы массивы были бы generic-ами, это было бы проще. Для обеспечения правильной конвертации многомерного массива в одномерный и обратно требуется сохранить не только данные, но и размерности массива. Приведенный тобой код может работать только с квадратными массивами т.к. функция ToTwoDimensionalArray использует Math.Sqrt(array.Length). Я бы ввел специальный тип для хранения "плоского" массива. Например, так: Код: 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.
Пример использования: Код: c# 1. 2. 3. 4. 5. 6. 7.
Имея тип FlatArray<int> мы можем сериализовать/десериализовывать его вместо многомерного массива. Из-за того что Array не generic тип приходится явно указывать тип элемента массива и выполнять явное приведение типа после вызова метода ToArray(). Это мелочь с которой можно смириться. Или можно вместо метода ToFlatArray<T> работающий с типом Array поставить реализации под кокретные размерности, что избавит от необходимости указывать тип-аргумент. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Приведенное решение должно работать с массивами любого размера при условии что это не jagged массив. Самой интересной частью оказалась реализация восстановления элементов многомерного массива. Для value типов спасает метод Buffer.BlockCopy(), но он не работает для ссылочных типов. Пришлось делать копирование поэлементно, что наверняка замедлит десереализацию больших массивов. Было бы неплохо улучшить, но пока нет идей как. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.03.2014, 14:52 |
|
|
start [/forum/topic.php?fid=20&msg=38579063&tid=1403167]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 339ms |
total: | 479ms |
0 / 0 |