Как я могу объединить 2 массива в 1 массив

У меня есть два списка, в которых есть такие символы, как:

Listbox1     Listbox2
 Model1       Price1
 Model2       Price2
 Model3       Price3
 Model4       Price4

Я хочу отобразить оба списка в listbox3 следующим образом:

 Listbox
Model1,Price1
Model2,Price2
Model3,Price3
Model4,Price4

Я попытался объединить список, но я получил ошибку:

System.ArgumentOutOfRangeException: 'Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index'

    ///
    ///Modelos
    ///

    public string[] _EModelsArray;
    public string[] _ModelsArray;
    public string[] _UnionArray;

    StreamReader _reader = new StreamReader(@".\MODELOS.txt"); // Abre el archivo de texto
    List<string> _info = new List<string>();
    while(!_reader.EndOfStream)
    {
        string _line = _reader.ReadLine().Trim();
        string [] _tokens = _line.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

        ///
        /// crear el listado
        /// 
        var _Model = new List<string>();
        var _EModel = new List<string>();
        var _Union = new List<string>();
        //var _EQty = new List<string>();

        if (_tokens.Length == 2)
        {
            _Model.Add(_tokens[0]);
            _EModel.Add(_tokens[1]);
            //_EQty.Add(_tokens[2]);
        }

        //else
        //MessageBox.Show("Error!!!");


        ///
        /// Convertir en array
        ///
        _ModelsArray = _Model.ToArray();
        _EModelsArray = _EModel.ToArray();


        foreach (var item in _ModelsArray)
        {
            listBox1.Items.Add(item);
        }

        foreach (var item in _EModelsArray)
        {
            listbx2.Items.Add(item);
        }

        for (int i = 0; i <=30; i ++)
        {
            _Union[i] = _Model[i] + _EModel[i];
        }

        _UnionArray = _Union.ToArray();
        foreach (var item in _UnionArray)
        {
            listbx_union.Items.Add(item);
        }

тогда как я работаю на:

 Listbox3
Model1,Price1
Model2,Price2
Model3,Price3
Model4,Price4

Модель и цена объединены в 1 строку.

TBH, создайте класс для хранения этих данных, а затем используйте его, как хотите... Вы удваиваете эти данные...

Trevor 15.07.2019 21:24

Возможный дубликат Как объединить два массива в С#?

Trevor 15.07.2019 21:34
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
88
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Две вещи, которые нужно изменить после быстрого просмотра исходного кода. Во-первых, не используйте буквальное число для создания списка объединения. Во-вторых, в списке объединения еще нет элементов, поэтому вы должны использовать .Add(). Так:

for (int i = 0; i < _Model.Length; i ++)
{
    _Union.Add(_Model[i] + "," + _EModel[i]);
}

Спасибо! это то, что мне нужно!

Esmeralda G. 15.07.2019 21:31

@ЭсмеральдаГ. этот ответ объясняет вашу ошибку, которую вы получаете? Вы знаете, почему вы получаете эту ошибку?

Trevor 15.07.2019 21:31

Ну, я не уверен, но думаю, это потому, что я использовал: _Union[i] вместо _Union.add

Esmeralda G. 15.07.2019 22:10

Да, это причина. Использование индекса 0 в пустом списке приведет к исключению ArgumentOutOfRange. Вот почему я сказал: "... в списке объединения еще нет элементов..."

Kevin Brock 24.07.2019 18:45

Вы можете использовать одну из перегрузок LINQ .Select().

var listBox1 = new[] { "Model1", "Model2", "Model3", "Model4" };
var listBox2 = new[] { "Price1", "Price2", "Price3", "Price4" };

var listbox3 = listBox1.Select((value, element) => $"{value},{listBox2[element]}");

Эта перегрузка использует лямбду Func<string, int, string>, чтобы использовать не только перечисленный элемент в запросе, но и номер элемента. Это позволяет использовать номер элемента в качестве позиции второго массива.

Вы потенциально получаете ошибку из своего объявления цикла forfor (int i = 0; i <=30; i ++). Вы предоставляете предопределенную ровно 31 итерацию для этого цикла. Чтобы устранить эту ошибку, вам нужно будет иметь> = 31 элемент в каждом из ваших массивов.

Не могли бы вы добавить информацию о том, почему ОП получал результаты, которые им не нужны, и почему произошла ошибка. Это поможет им увидеть, где они ошибаются.

Trevor 15.07.2019 21:25

Спасибо за обновление, это поможет ОП лучше понять, где они отвалились.

Trevor 15.07.2019 21:43

Причина, по которой вы получаете эту ошибку, заключается в том, что у вас есть жестко запрограммированное значение 30, а в вашем списке меньше 31 элементов, поэтому вы пытаетесь получить доступ к индексу, который не существует в вашем цикле:

for (int i = 0; i <= 30; i ++)  // This will fail if there are less than 31 items

Один из способов решить эту проблему — просто использовать свойство Count списка в условии цикла:

for (int i = 0; i <= _Model.Count; i++)

Однако может иметь смысл создать один класс со свойствами, которые вы хотите установить для каждой строки в файле, а затем создать список этого класса. Затем вы можете установить свои элементы ListBox для определенного свойства класса.

Например, мы можем создать класс Model, чтобы он выглядел так:

class Model
{
    public string Name { get; set; }
    public string Price { get; set; }
    public string Both => $"{Name},{Price}";
}

Затем мы можем создать метод, который читает файл и возвращает список этого класса на основе содержимого файла:

public static List<Model> GetModels(string filePath)
{
    return File?
        .ReadAllLines(filePath)
        .Where(line => line.Contains(':'))
        .Select(line => line.Split(':'))
        .Select(lineParts => new Model { Name = lineParts[0], Price = lineParts[1] })
        .ToList();
}

И теперь мы можем просто вызвать этот метод, чтобы получить один список, а затем обновить наши listBox с информацией из каждого элемента в списке:

foreach (var model in GetModels(@".\MODELOS.txt"))
{
    listBox1.Items.Add(model.Name);
    listbx2.Items.Add(model.Price);
    listbx_union.Items.Add(model.Both);
}

Другие вопросы по теме