嘿大家我希望你能解决我的小问题。我想拆分一个已经拆分的字符串,但是我得到了错误:"索引超出了数组的范围"。
我知道我的阵列太小但我不知道在这种情况下如何增加它。这是代码。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
namespace Reserveringssysteem
{
public partial class Form2 : Form
{
public string naam;
public string adres;
public string datum;
public int kamernr;
public int id;
public int indexnr;
public int indexnrb;
public int indexnrc;
Kamer[] reserveringArray = new Kamer[6];
public Form2()
{
InitializeComponent();
}
private void backbtn_Click(object sender, EventArgs e)
{
this.Close();
}
private void Form2_Load(object sender, EventArgs e)
{
using (StreamReader sr = new StreamReader(@"C:\Users\Gebruiker\Desktop\OIS\Hotelsysteem\Reserveringen.txt", Encoding.Default))
{
string text = sr.ReadToEnd();
string[] lines = text.Split(';');
foreach (string s in lines)
{
id = Convert.ToInt32(s.Split(':')[0]);
indexnr = s.IndexOf(':');
naam = s.Split('/')[indexnr];
indexnra = s.IndexOf("/");
adres = s.Split('<')[indexnra];
indexnrb = s.IndexOf('<');
kamernr = Convert.ToInt32(s.Split('>')[indexnrb]);
indexnrc = s.IndexOf('>');
datum = s.Split(';')[indexnrc];
ListViewItem opbouwera = new ListViewItem(Convert.ToString(id));
opbouwera.SubItems.Add(naam);
opbouwera.SubItems.Add(adres);
opbouwera.SubItems.Add(Convert.ToString(kamernr));
opbouwera.SubItems.Add(datum);
reserveringlistview.Items.Add(opbouwera);
}
}
}
}
}
从我开始使用indexnra
时开始出现问题。我希望你们其中一个人可以帮助我。
答案 0 :(得分:2)
这些行就是问题的一个例子:
indexnr = s.IndexOf(':');
naam = s.Split('/')[indexnr];
IndexOf
将返回:
字符的字符串中的位置(例如9
,如果冒号是第10个字符,因为索引是从零开始的。)
s.Split('/')
将返回一个字符串数组,因此在该示例中,如果对indexnr
使用值9,则会要求输入第10个字符串。
所有这些都表示IndexOf
的输出很可能不是调用Split
后用于查找特定字符串的适当索引。
从您的代码中不清楚您的预期输出是什么 - 如果您添加示例输入和预期输出,您可能会获得更好的方法来获取所需内容。
答案 1 :(得分:2)
我会使用正则表达式来解析行中的数据。因为它描述了输入字符串的布局,而不是使用某些分隔符的子字符串和索引。另外,我会使用自定义对象将人员数据存储在命名良好的字段中:
public class Person
{
public int Id {get;set;}
public string Name {get;set;}
public string Address {get;set;}
public string Appartment {get;set;}
public DateTime Date {get;set;}
}
这里是正则表达式,它为输入字符串中的每个数据部分定义组:
(?<id>\d+)
第一组是 id - 数字序列:
然后带有一些空格的分隔符(?<name>[\w\s]+)
由字母和空格组成的名称/
秒分隔符(?<address>[\w\d\s]+)
地址 - 字母,数字,空格<\s*(?<app>\d+)\s*>
公寓号码 - 尖括号中的数字\s+
一些空格(?<date>\d{4}-\d{2}-\d{2})
以yyyy-dd-MM格式约会用法:
var regex = new Regex(@"(?<id>\d+):(?<name>[\w\s]+)/(?<address>[\w\d\s]+)<\s*(?<app>\d+)\s*>\s*(?<date>\d{4}-\d{2}-\d{2})");
var people = from line in lines
let match = regex.Match(line)
where match.Success
select new Person {
Id = Int32.Parse(match.Groups["id"].Value),
Name = match.Groups["name"].Value.Trim(),
Address = match.Groups["address"].Value.Trim(),
Appartment = match.Groups["app"].Value,
Date = DateTime.ParseExact(match.Groups["date"].Value.Trim(),"yyyy-dd-MM",null)
};
对于此示例文件
1:Jeroen Wasser Poppy Paashaas / Bijloopstraat 21&lt; 5个2017-31-12; 2: Bob White / Bijloopstraat 22&lt; 15 - ; 2016-28-10;
您将解析两个人:
[
{
"Id": 1,
"Name": "Jeroen Wasser Poppy Paashaas",
"Address": "Bijloopstraat 21",
"Appartment": "5",
"Date": "2017-12-31T00:00:00"
},
{
"Id": 2,
"Name": "Bob White",
"Address": "Bijloopstraat 22",
"Appartment": "15",
"Date": "2016-10-28T00:00:00"
}
]
然后抓取人员集合并在ListView中显示它们。即使用演示文稿(在UI上显示数据)单独访问数据(读取文件和解析人员)。
注意:您还可以在正则表达式中使用未命名的组。它的可读性会降低,但更紧凑:
(\d+):([\w\s]+)/([\w\d\s]+)<\s*(\d+)\s*>\s*(\d{4}-\d{2}-\d{2})
您必须按索引而不是名称
读取组Id = Int32.Parse(match.Groups[1].Value),