Как я могу создать указатель на массив, и какие шаги нужно предпринять для решения этой задачи?

Здравствуйте! Подскажите, как можно решить следующую задачу? У меня есть несколько массивов, например: <br/> <code class="cs">byte[] array_bob, byte[] array_tom, ... </code> <br/> В зависимости от значения переменной, мне нужно выбирать соответствующий массив для дальнейшей обработки. <br/> <br/> Я использую конструкцию switch для выбора массива, но не хочу повторять одни и те же действия в каждом case. Вместо этого, я хотел бы сначала установить выбранный массив, а потом использовать его в коде после switch. <br/> <br/> Пример решения может выглядеть так: <br/> <pre><code class="cs">string commonArray = "";

switch (name)
{
    case "Bob":
        commonArray = array_bob;
        break;
    case "Tom":
        commonArray = array_tom;
        break;
    case "Sam":
        commonArray = array_sam;
        break;
}

/*

Тут основной код с использованием commonArray

*/</code></pre> <br/> <br/> Обратите внимание, что массивы содержат бинарные данные, а не строки.
  • 29 октября 2024 г. 8:32
Ответы на вопрос 3
Здравствуйте! Чтобы создать указатель на массив и избежать дублирования кода при выборе массива в зависимости от значения переменной, вы можете использовать массив указателей на массивы (или ссылок, если вы используете C#). Это снизит повторяемость кода и сделает ваш код более чистым и удобным для сопровождения.

Вот пример решения, основанного на том, что вы хотите достичь:

```csharp
// Предположим, что у вас есть несколько массивов:
byte[] array_bob = { 1, 2, 3 };
byte[] array_tom = { 4, 5, 6 };
byte[] array_sam = { 7, 8, 9 };

// Создаем массив указателей (или ссылок) на ваши массивы
byte[][] arrayReferences = new byte[][] { array_bob, array_tom, array_sam };

// Создаем словарь для соответствия имен массивам
Dictionary<string, byte[]> arrayMapping = new Dictionary<string, byte[]>
{
    { "Bob", array_bob },
    { "Tom", array_tom },
    { "Sam", array_sam }
};

// Переменная для хранения выбранного массива
byte[] commonArray = null;

// Пример имени, для выбора массива
string name = "Tom"; // Это значение может быть динамическим

if (arrayMapping.ContainsKey(name))
{
    commonArray = arrayMapping[name]; // Устанавливаем указатель на выбранный массив
}

// Теперь вы можете использовать commonArray в своем основном коде
if (commonArray != null)
{
    // Основной код с использованием commonArray
    foreach (var b in commonArray)
    {
        Console.Write(b + " ");
    }
}
else
{
    Console.WriteLine("Массив не найден.");
}
```

### Объяснение кода:

1. **Массивы**: У вас уже есть массивы с бинарными данными (в данном случае, тип `byte[]`).

2. **Словарь (Dictionary)**: Используйте словарь для соответствия строковых имен массивам. Это позволяет легко выбирать массив на основе имени.

3. **Выбор массива**: Используйте имя, чтобы получить соответствующий массив из словаря. 

4. **Обработка общего массива**: Теперь ваш код, использующий `commonArray`, может быть написан один раз, а не дублироваться в каждом `case`.

Этот подход делает код более чистым и уменьшает вероятность ошибок при изменении логики работы с массивами в будущем.
Заменить массивы на List - он ссылочный, и все будет работать без копирования. 
В принципе ваш код вроде тоже должен работать - но это будет копирование.
Не проще ли вынести логику работы с 1 массивом в отдельную функцию и в зависимости от name передавать разные массивы? 
void CommonLogic(byte[] array)
{
      method_one(array);
      method_two(array);
       /* Основной код */
}
// Вызов этой функции
byte[] common;

switch (name)
{
    case "Bob":
        common = array_bob;
        break;
    case "Tom":
        common = array_tom;
        break;
    case "Sam":
        common  = array_sam;
        break;
}
CommonLogic(common);
Похожие вопросы