【问题标题】:C# array returns value by foreach, not by array indexC#数组按foreach返回值,而不是按数组索引
【发布时间】:2017-06-13 12:51:14
【问题描述】:

我有以下代码:

String[] splititemcol;
String[] splititem;
String singlestring;
while (reader.Read())
{
    splititemcol = reader.GetValue(2).ToString().Split((char)16); //split each item
    for (int i = 0; i < splititemcol.Count(); i++)
    {
        splititem = splititemcol[i].ToString().Split((char)14);
        resultstr.Append("<tr><td>" + splititem[0] + "</td><td>");
        singlestring = "";
        for(int k=0;k<splititem.Count();k++)
        {
            if(k==2)
            {
                singlestring = splititem[k].ToString();
                break;
            }
        }
        resultstr.Append(singlestring + "</td></tr>");
    }
}

在上面的代码中,我可以获得第三个 splititem 的值。

String[] splititemcol;
String[] splititem;
String singlestring;
while (reader.Read())
{
    splititemcol = reader.GetValue(2).ToString().Split((char)16); //split each item
    for (int i = 0; i < splititemcol.Count(); i++)
    {
        splititem = splititemcol[i].ToString().Split((char)14);
        resultstr.Append("<tr><td>" + splititem[0] + "</td><td>");
        singlestring =splititem[2].ToString();
        resultstr.Append(singlestring + "</td></tr>");
    }
}

在上面的代码中,我尝试仅通过数组索引获取第三个splititem 的值,即没有foreach

但它会在第 9 行引发Index was outside the bounds 错误,如下所示。

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IndexOutOfRangeException: Index was outside the bounds of the array.

当我测试 splititem.Count 时,它显示为 4。

编辑:

我像这样手动将数组的每个值存储在变量中,并且都是返回值。所以我得出的结论是,要么我们必须通过 for 循环来迭代数组,要么这个脚本由于字符串中的奇怪分隔符(字符 14)而被卡住。

String[] splititemcol;
String[] splititem;
String singlestring;
String item="";
String weight="";
String quantity="";
String amount="";
while (reader.Read())
{
    splititemcol = reader.GetValue(2).ToString().Split((char)16); //split each item
    for (int i = 0; i < splititemcol.Count(); i++)
    {
        splititem = splititemcol[i].ToString().Split((char)14);
        resultstr.Append("<tr><td>" + splititem[0] + "</td><td>");
        singlestring = "";
        for(int k=0;k<splititem.Count();k++)
        {
                        if (k == 0)
                            item = splititem[k].ToString();
                        else if (k == 1)
                            weight = splititem[k].ToString();
                        else if (k == 2)
                            quantity = splititem[k].ToString();
                        else if (k == 3)
                            amount = splititem[k].ToString();
        }
        resultstr.Append(weight + "</td><td>" + quantity + "</td><td>" + amount + "</td></tr>");
    }
}

感谢你们所有试图解决这个问题的人。

【问题讨论】:

  • 这意味着splititem[2] 不存在。
  • 你能解释一下吗?
  • 表示数组splititem最多只有2个元素,而不是3个
  • 实际上这意味着splititem[2]存在于一些个读者结果中,但不是所有个结果。
  • Dhay,它可能会说第一个项目的计数为 4,但我敢打赌,错误不在第一个项目上,它可能更进一步,这意味着文件夹项目或其他内容类型不有第三个字段。

标签: c# asp.net arrays split


【解决方案1】:

这意味着splititem[2] 不存在。在您的第一种情况下,您有以下条件,仅考虑将具有 splititem[2] 的行,但在第二种情况下,您尝试直接访问索引 2 导致异常

                    if(k==2)
                    {
                        singlestring = splititem[k].ToString();
                        break;
                    }

【讨论】:

  • @Dhay 你测试了splititemcol中的所有 splititem.Counts
  • @Dhay,重点是,并非来自splititemcol[] 的所有行都会有这么多参数
  • 是的。每个字段有 4 个。
  • @Dhay 很好,然后在分配后立即写System.Diagnostics.Debug.Assert(splititem.Length == 4, "Oops, I screwed up"); (splititem = splititemcol[i].ToString().Split((char)14);)。它将帮助您确保一切都像您期望的那样。
【解决方案2】:

比较这个(从第一个 sn-p):

if(k==2)
{
    singlestring = splititem[k].ToString();
    break;
}

用这个(来自第二个sn-p):

 singlestring =splititem[2].ToString();

在第一种情况下,您进行检查并假设k==2 为真,您将读取相应的值。第二种情况错过了,没有人保证splititem 的长度为 3。

【讨论】:

    猜你喜欢
    • 2021-05-23
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-25
    • 2013-11-17
    相关资源
    最近更新 更多