我有两个列表框,它们的字符如下:
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行。
答案 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]);
}