#c# #.net #arrays
#c# #.net #массивы
Вопрос:
В документации для Array.BinarySearch
.NET говорится, что он не работает для массива с отрицательными индексами. Насколько я знаю, в .NET есть только массивы с положительными индексами, и вам не разрешено наследовать от System.Array
типа.
Почему в документации это указано и как это возможно?
Этот метод не поддерживает поиск массивов, содержащих отрицательные индексы. массив должен быть отсортирован перед вызовом этого метода.
Комментарии:
1. Вы можете создать массив с любой нижней границей, которую вы хотите, просто не очевидно в C #. Проверьте blog.csharphelper.com/2010/12/22 /… , или искать больше — bing.com/search ? q= c% 23 массив отрицательный нижняя граница
2.
var negativeIndexesArray = Array.CreateInstance(typeof (int), new[] {10}, new[] {-5});
4. Вы должны понимать, для чего предназначена документация. Документ предназначен для .NET, а не конкретно для C #. Отрицательные индексы — это совершенно законная вещь в C , на которую также есть ссылка в связанной ссылке.
5. Также в C # такие массивы могут возникать при взаимодействии с COM-компонентом. Несмотря на то, что более типичной ошибкой является то, что их первый элемент находится под индексом 1.
Ответ №1:
Вы можете создать массив, который позволяет вам добавлять отрицательные индексы к вашему массиву:
var grid = (int[,])Array.CreateInstance(typeof(int),new[] {7,7}, new[] {-3,-3});
for (int r = -3 ; r <= 3 ; r ) {
for (int c = -3 ; c <= 3 ; c ) {
grid[r,c] = 10 r c;
}
}
Вы также можете создать массив с одним измерением, но вы не сможете преобразовать его в int[]
, потому что CLR использует специальный тип для одномерных массивов. Однако вы могли бы использовать такой массив с отрицательными индексами через Array
API. В документации говорится, что вам не разрешено передавать такие массивы в BinarySearch
метод.
Ответ №2:
В .NET есть способ создать Array
объект с отрицательными индексами, используя этот Array.CreateInstance
метод перегрузки фабрики, где вы можете указать нижнюю границу индекса:
public static Array CreateInstance(
Type elementType,
int[] lengths,
int[] lowerBounds
)
1-мерный массив длиной 10 и индексом, начинающимся с -10:
var a = Array.CreateInstance(typeof(string), new[] { 10 }, new[] { -10 });
a.SetValue("test", -5);
Console.WriteLine(a.GetValue(-5));
Console.WriteLine(a.GetLowerBound(0));
// yields:
// test
// -10
Также обратите внимание, что 1-мерный массив с отрицательной нижней границей индекса не может быть приведен к вектору, например int[]
, который должен быть проиндексирован на основе 0 . Этот тип массива отличается от векторного или индексированного массива на основе 0:
Console.WriteLine((Array.CreateInstance(typeof(int), new[] { 1 }, new[] { -1 })).GetType());
Console.WriteLine((Array.CreateInstance(typeof(int), new[] { 1 }, new[] { 0 })).GetType());
Console.WriteLine((new int[] {}).GetType());
// yields:
// System.Int32[*]
// System.Int32[]
// System.Int32[]
(int[])Array.CreateInstance(typeof(int), new[] { 1 }, new[] { -1 })
// throws:
// System.InvalidCastException