Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我想拆分一个已拆分的字符串_C# - Fatal编程技术网

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;}
}
下面是一个正则表达式,它为输入字符串中的每个数据部分定义了组:

  • (?\d+)
    第一组是id-数字序列
  • 然后用空格分隔
  • (?[\w\s]+)
    由字母和空格组成的名称
  • /
    第二个分隔符
  • (?[\w\d\s]+)
    地址-字母、数字、空格
  • 装置编号-角括号中的数字
  • \s+
    一些空格
  • (?\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)
             };
然后抓取人员集合并在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;}
}
下面是一个正则表达式,它为输入字符串中的每个数据部分定义了组:

  • (?\d+)
    第一组是id-数字序列
  • 然后用空格分隔
  • (?[\w\s]+)
    由字母和空格组成的名称
  • /
    第二个分隔符
  • (?[\w\d\s]+)
    地址-字母、数字、空格
  • 装置编号-角括号中的数字
  • \s+
    一些空格
  • (?\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)
             };
然后抓取人员集合并在ListView中显示。也就是九月