Что означает Array.BinarySearch означает, когда он говорит массив с отрицательными индексами?

#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});

3. devx.com/tips/Tip/41349

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;
    }   
}
 

Демонстрация на ideone.

Вы также можете создать массив с одним измерением, но вы не сможете преобразовать его в 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