如何将2个数组连接为1个数组

时间:2019-07-15 19:12:24

标签: c# arrays arraylist listbox concatenation

我有两个列表框,它们的字符如下:

Listbox1     Listbox2
 Model1       Price1
 Model2       Price2
 Model3       Price3
 Model4       Price4

我想以这种方式在列表框3中显示两个列表:

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

我尝试合并列表,但出现错误:

  

System.ArgumentOutOfRangeException:'索引超出范围。必须为非负数并且小于集合的大小。   参数名称: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行。

3 个答案:

答案 0 :(得分:2)

您可以利用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> lambda不仅使用查询中的枚举项目,还使用项目编号。这样您就可以将项目编号用作第二个数组的数组位置。

您可能会从for循环声明for (int i = 0; i <=30; i ++)中得到错误。您正在为该循环提供预定的准确31次迭代。要减轻此错误,每个数组中必须具有> = 31个元素。

答案 1 :(得分:0)

出现此错误的原因是,您具有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();
}

现在我们可以调用此方法以获取单个列表,然后使用列表中每个项目的信息来更新listBoxes:

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

答案 2 :(得分:-1)

快速查看原始代码有两点需要更改。首先,不要使用文字数字来创建联合列表。其次,联合列表还没有元素,因此您应该使用.Add()。像这样:

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