У меня есть два списка, в которых есть такие символы, как:
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 строку.
Возможный дубликат Как объединить два массива в С#?





Две вещи, которые нужно изменить после быстрого просмотра исходного кода. Во-первых, не используйте буквальное число для создания списка объединения. Во-вторых, в списке объединения еще нет элементов, поэтому вы должны использовать .Add(). Так:
for (int i = 0; i < _Model.Length; i ++)
{
_Union.Add(_Model[i] + "," + _EModel[i]);
}
Спасибо! это то, что мне нужно!
@ЭсмеральдаГ. этот ответ объясняет вашу ошибку, которую вы получаете? Вы знаете, почему вы получаете эту ошибку?
Ну, я не уверен, но думаю, это потому, что я использовал: _Union[i] вместо _Union.add
Да, это причина. Использование индекса 0 в пустом списке приведет к исключению ArgumentOutOfRange. Вот почему я сказал: "... в списке объединения еще нет элементов..."
Вы можете использовать одну из перегрузок 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 элемент в каждом из ваших массивов.
Не могли бы вы добавить информацию о том, почему ОП получал результаты, которые им не нужны, и почему произошла ошибка. Это поможет им увидеть, где они ошибаются.
Спасибо за обновление, это поможет ОП лучше понять, где они отвалились.
Причина, по которой вы получаете эту ошибку, заключается в том, что у вас есть жестко запрограммированное значение 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);
}
TBH, создайте класс для хранения этих данных, а затем используйте его, как хотите... Вы удваиваете эти данные...