C# 我想拆分一个已拆分的字符串
大家好,我希望你们能帮我解决我的小问题。我想拆分一个已经拆分的字符串,但得到的错误是:“索引超出了数组的边界” 我知道我的数组太小了,但我不知道在这种情况下如何增加它。这是代码C# 我想拆分一个已拆分的字符串,c#,C#,大家好,我希望你们能帮我解决我的小问题。我想拆分一个已经拆分的字符串,但得到的错误是:“索引超出了数组的边界” 我知道我的数组太小了,但我不知道在这种情况下如何增加它。这是代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using
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);
}
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用System.IO;
命名空间保留系统
{
公共部分类表单2:表单
{
公共字符串naam;
公共字符串地址;
公共字符串数据;
公共内特卡门尔;
公共int id;
公共综合指数;
公共综合指数;
公共国际指数;
Kamer[]保留阵列=新Kamer[6];
公共表格2()
{
初始化组件();
}
私有void backbtn_单击(对象发送方,事件参数e)
{
这个。关闭();
}
私有void Form2_加载(对象发送方、事件参数e)
{
使用(StreamReader sr=new StreamReader(@“C:\Users\Gebruiker\Desktop\OIS\Hotelsysteem\Reserveringen.txt”,Encoding.Default))
{
string text=sr.ReadToEnd();
string[]line=text.Split(“;”);
foreach(行中的字符串s)
{
id=Convert.ToInt32(s.Split(“:”)[0]);
indexnr=s.IndexOf(':');
naam=s.Split('/')[indexnr];
indexnra=s.IndexOf(“/”);
adres=s.Split(“”);
基准面=s.Split(“;”)[indexnrc];
ListViewItem opbouwera=新的ListViewItem(Convert.ToString(id));
补充(naam);
opbouwera.子项。添加(adres);
添加(Convert.ToString(kamernr));
opbouwera.子项添加(基准);
reserveringlistview.Items.Add(opbouwera);
}
}
}
}
}
从我开始使用
indexnra
的那一刻起,问题就出现了。我希望你们中的一个人能帮我解决这个问题。以下几行就是问题的一个例子:
indexnr = s.IndexOf(':');
naam = s.Split('/')[indexnr];
IndexOf
将返回:
字符字符串中的位置(例如,如果冒号是第10个字符,因为索引是从零开始的,9
)
s.Split('/')
将返回一个字符串数组,因此在该示例中,如果对indexnr
使用值9,则需要第10个字符串
所有这些都表明,IndexOf
的输出很可能不是调用Split
后用于查找特定字符串的适当索引
从您的代码中不清楚您的预期输出是什么-如果您添加示例输入和预期输出,您可能会得到一种更好的方法来获取所需内容。以下几行就是问题的示例:
indexnr = s.IndexOf(':');
naam = s.Split('/')[indexnr];
IndexOf
将返回:
字符字符串中的位置(例如,如果冒号是第10个字符,因为索引是从零开始的,9
)
s.Split('/')
将返回一个字符串数组,因此在该示例中,如果对indexnr
使用值9,则需要第10个字符串
所有这些都表明,IndexOf
的输出很可能不是调用Split
后用于查找特定字符串的适当索引
从您的代码中不清楚您的预期输出是什么-如果您添加一个示例输入和预期输出,您可能会得到一个更好的方法来获取所需的内容。我会使用正则表达式来解析行中的数据。因为它描述了输入字符串的布局,而不是使用一些分隔符的子字符串和索引。此外,我还将使用自定义对象,将人员数据存储在命名良好的字段中:
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+)
然后用空格分隔:
由字母和空格组成的名称(?[\w\s]+)
第二个分隔符/
地址-字母、数字、空格(?[\w\d\s]+)
装置编号-角括号中的数字
一些空格\s+
yyyy-dd-MM格式的日期(?\d{4}-\d{2}-\d{2})
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)
};
然后抓取人员集合并在ListView中显示。即,通过演示(在UI上显示数据)单独访问数据(读取文件和解析人员)
注意:您也可以在正则表达式中使用未命名的组。它的可读性较差,但更紧凑:
(\d+):([\w\s]+)/([\w\d\s]+)<\s*(\d+)\s*>\s*(\d{4}-\d{2}-\d{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+)
然后用空格分隔:
由字母和空格组成的名称(?[\w\s]+)
第二个分隔符/
地址-字母、数字、空格(?[\w\d\s]+)
装置编号-角括号中的数字
一些空格\s+
yyyy-dd-MM格式的日期(?\d{4}-\d{2}-\d{2})
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)
};
然后抓取人员集合并在ListView中显示。也就是九月