267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
|
|||||||||||
1 | |||||||||||
Методы расширения многомерных и одномерных массивов18.05.2012, 20:17. Показов 3230. Ответов 6
Лишь недавно заметил, что методы расширения LINQ для многомерных массивов
0
|
18.05.2012, 20:17 | |
Ответы с готовыми решениями:
6
Приложение представляющее организацию многомерных вычислений многомерных массивов нужна помощь в С на тем одномерных и многомерных масивов Даны два одномерных массива разной размерности. Для каждого из заданных одномерных массивов выполнить: из Расхождение многомерных массивов |
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
|
||||||
19.05.2012, 02:45 | 2 | |||||
Возможности у этих интерфейсов одинаковы и заключаются лишь в одном: предоставлении итератора для обхода коллекции.
Другое дело, что все методы-расширения LINQ построены на работе именно с IEnumerable<T>, а не с IEnumerable. Но это довольно легко "обойти", приведя массив к интерфейсу нужного типа:
1
|
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
|
|
19.05.2012, 03:16 [ТС] | 3 |
Я выразился не совсем верно, имея в виду список методов расширения.
За описание "обхода" спасибо, но вопрос остается прежним. Мне уже не впервой не удается понять тонкости реализации Array)
0
|
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
|
||||||||||||||||
19.05.2012, 11:52 | 4 | |||||||||||||||
Сообщение было отмечено как решение
Решение
Какой именно вопрос?
Если вы вот об этом то ответ прост: мешает ему то, что класс Array, от которого наследуются все массивы, не реализует интерфейс IEnumerable<T>, так как на момент его создания (.NET 1.0) обобщенний в языке еще не существовало. Предвидя ваше замечание о том, что одномерные массивы реализуют этот интерфейс, скажу сразу: одномерные массивы с нулевым индексом, так называемые SZArrays (Single-dimensional, Zero-based arrays) являются особым случаем для компилятора и рантайма, так как одномерные массивы с нулевым индексом - фундаментальные структуры данных практически во всех языках программирования, потому компилятор обрабатывает эти массивы немного иначе с целью повышения их производительности. В частности, для одномерных массивов с нулевым индексом генерируется особый IL-код, где обращение к отдельным элементам происходит не через вызов виртуального метода конкретной реализации класса Array, а через прямую адресацию памяти, как происходит в языках типа С/С++. Поэтому, кстати, ступенчатые массивы в шарпе практически всегда выигрывают по производительности многомерным. В общем, в шарпе SZArray - отдельный случай, причем используемый довольно часто, потому конкретно для этого случая в новой версии фреймворка добавили и реализацию нового интерфейса. Общий же класс Array остался без изменений:
А вот если создать SZArray, то дело принимает другой оборот:
Ради такого никто не будет заморачиваться с перелопачиванием класса для реализации нового интерфейса.
3
|
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
|
|||||||||||
19.05.2012, 13:28 [ТС] | 5 | ||||||||||
Спасибо за столь полный ответ. Это именно то, что я спрашивал.
Но, признаться, впервые услышал про Zero-based arrays, и соответственно, появились новые вопросы. Например, в одном из вопросов со StackOverflow написано, что
С другой стороны, в другом вопросе там же, утверждается, что
0
|
17791 / 12942 / 3381
Регистрация: 17.09.2011
Сообщений: 21,215
|
|
19.05.2012, 14:41 | 6 |
К сожалению, атрибут CLSCompliantAttribute не всегда может точно определить соответствие метода/класса/сборки и т.д. правилам CTS.
В данном случае массив создается динамически, следовательно его размерность будет известна только во время рантайма, а атрибут используется на стадии компиляции. Там этот же товарищ следующим предложением пишет: Скорее всего так и есть, но суть в том, что при создании массива, рантайм генерирует класс, наследующийся от Array, кроме случаев, когда массив является одномерным с нулевой нижней границей. В новой версии фреймворка этому отдельному случаю добавили поддержку обобщенного интерфейса, а сам класс Array трогать просто-напросто не стали. Да и как добавить реализацию обобщенного интерфейса, не делая сам класс Array обобщенным? А это, согласитесь, довольно серьезные изменения для такого фундаментального класса.
1
|
267 / 257 / 43
Регистрация: 18.03.2012
Сообщений: 506
|
|
19.05.2012, 14:50 [ТС] | 7 |
Спасибо.
0
|
19.05.2012, 14:50 | |
19.05.2012, 14:50 | |
Помогаю со студенческими работами здесь
7
Создание многомерных массивов Сортировка многомерных массивов Обработка многомерных массивов Обработка многомерных массивов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |