【问题标题】:How can I concatenate 2 arrays into 1 array如何将 2 个数组连接成 1 个数组
【发布时间】:2019-07-15 19:12:24
【问题描述】:

我有两个列表框,其中的字符如下:

Listbox1     Listbox2
 Model1       Price1
 Model2       Price2
 Model3       Price3
 Model4       Price4

我想在一个 listbox3 中显示两个列表,这样:

 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 行。

【问题讨论】:

标签: c# arrays arraylist listbox concatenation


【解决方案1】:

您可以利用 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&lt;string, int, string&gt; lambda 不仅使用查询中的枚举项,还使用项号。这允许您使用项目编号作为第二个数组的数组位置。

您可能会从您的for 循环声明for (int i = 0; i &lt;=30; i ++) 中得到错误。您正在为该循环提供预先确定的 31 次迭代。要缓解此错误,您必须在每个数组中包含 >=31 个元素。

【讨论】:

  • 能否请您添加输入,说明 OP 为何获得他们不想要的结果以及错误原因。这将帮助他们了解哪里出了问题。
  • 感谢您的更新,这将有助于 OP 更好地了解他们掉在哪里。
【解决方案2】:

您收到该错误的原因是您的硬编码值为30,并且列表中的项目少于31,因此您尝试访问的索引没有' t 存在于您的循环条件中:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢!这就是我需要的!
    • @EsmeraldaG。这个答案是否解释了您遇到的错误?你知道为什么会出现这个错误吗?
    • 嗯,我不确定,但我认为是因为我使用的是:_Union[i] 而不是 _Union.add
    • 是的,这就是原因。在空列表上使用索引 0 将导致 ArgumentOutOfRange 异常。这就是为什么我说“......联合列表还没有元素......”
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2019-06-06
    • 2012-01-07
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多