C#:我不能';t访问do循环内列表中的信息

C#:我不能';t访问do循环内列表中的信息,c#,do-loops,C#,Do Loops,我有一个带有列表的类,我正在用另一个classes方法访问它。这很好,但当我尝试在do循环中使用该列表时,总是会得到一个“ArgumentOutofRangeException”。我真的很困惑,为什么在do循环中使用列表会导致它为空,或者至少我认为是这样的。如果有人能向我解释为什么会发生这样的事情,这将是非常有启发性的,也许我能想出我将如何让这一切发挥作用 以下是我的方法: private void ListToAttributes() { int count = -1;

我有一个带有列表的类,我正在用另一个classes方法访问它。这很好,但当我尝试在do循环中使用该列表时,总是会得到一个“ArgumentOutofRangeException”。我真的很困惑,为什么在do循环中使用列表会导致它为空,或者至少我认为是这样的。如果有人能向我解释为什么会发生这样的事情,这将是非常有启发性的,也许我能想出我将如何让这一切发挥作用

以下是我的方法:

private void ListToAttributes()
    {
        int count = -1;

        //Finds Attribute starting Line.
        do
        {
            count = count + 1;

        } while (Player.PlayerList[count] != "Attributes;");

        //Adds all Attributes to a list
        List<string> TypeAndAmount = new List<string>();

        do
        {
            TypeAndAmount.Add(Player.PlayerList[count]);
            count = count + 1;
        } while (Player.PlayerList[count] != ".");

        //Sorts by type and adds amount to Player Class


        foreach (string Line in TypeAndAmount)
        {
            string[] Type = Line.Split(' ');

            if (Type[0] == "Mind") { Player.Mind = int.Parse(Type[1]); }
            if (Type[0] == "Body") { Player.Body = int.Parse(Type[1]); }
            if (Type[0] == "Soul") { Player.Soul = int.Parse(Type[1]); }
        }
    }
private void list to attributes()
{
整数计数=-1;
//查找属性起始行。
做
{
计数=计数+1;
}while(Player.PlayerList[count]!=“Attributes;”);
//将所有属性添加到列表中
列表类型和装载量=新列表();
做
{
type和mount.Add(Player.PlayerList[count]);
计数=计数+1;
}while(Player.PlayerList[count]!=”);
//按类型排序并将数量添加到玩家类
foreach(类型为ANDAMOUNT的字符串行)
{
字符串[]类型=行。拆分(“”);
如果(类型[0]=“Mind”){Player.Mind=int.Parse(类型[1]);}
如果(类型[0]=“Body”){Player.Body=int.Parse(类型[1]);}
if(类型[0]=“Soul”){Player.Soul=int.Parse(类型[1]);}
}
}

我正在根据最佳猜测修改我的答案。当你打第二个do循环时,Player.PlayerList[count]仍然等于“Attributes”。然后进入第二个循环,并将“属性”添加到TypeAndAmount。当您尝试在该行上单击Line.Split(“”)时,它将只返回一个包含一项的数组。类型[1]将抛出ArgumentOutOfRangeException

我认为,如果在第二个do循环之前添加count=count+1,将解决您的问题

找到第一个“属性”部分的另一个聪明(我认为)方法是将其全部包装在一行中:

int count = -1;
while (Player.PlayerList[count++] != "Attributes;");

++表示法只是编写count=count+1的一种更快的方法。希望你会发现这很有用。:)

我正在根据最佳猜测修改我的答案。当你打第二个do循环时,Player.PlayerList[count]仍然等于“Attributes”。然后进入第二个循环,并将“属性”添加到TypeAndAmount。当您尝试在该行上单击Line.Split(“”)时,它将只返回一个包含一项的数组。类型[1]将抛出ArgumentOutOfRangeException

我认为,如果在第二个do循环之前添加count=count+1,将解决您的问题

找到第一个“属性”部分的另一个聪明(我认为)方法是将其全部包装在一行中:

int count = -1;
while (Player.PlayerList[count++] != "Attributes;");

++表示法只是编写count=count+1的一种更快的方法。希望你会发现这很有用。:)

问题是在Do循环中,您将count增加1,然后对其进行计算。这会导致计数大于元素数

这将有助于:

 while (count < Player.PlayerList.Count && Player.PlayerList[count] != "Attributes;");
while(count
问题出在Do循环中,您将计数提高1,然后对其进行计算。这会导致计数大于元素数

这将有助于:

 while (count < Player.PlayerList.Count && Player.PlayerList[count] != "Attributes;");
while(count
如果列表中没有与字符串匹配的项,则第一个循环将导致
ArgumentOutOfRangeException
。在这种情况下,您将愉快地走过列表的末尾。您的第二个循环也有相同的问题

此外,我认为您必须在两个循环之间再增加一次
count
——目前您正在将项目
“Attributes;”“
添加到列表
TypeAndAmount
。这还将导致
ArgumentOutOfRangeException
,因为在空格处拆分字符串
“Attributes;”“
只会生成一个字符串,并且您正在访问上一个循环中的
类型[1]

我建议使用一些LINQ重写代码(包括跳过
“Attributes;”“
”项的步骤)

您还可以将所有内容都放在一条语句中—不太冗长,但更难调试

var typeAndAmount = Player.PlayerList
                          .SkipWhile(entry => entry != "Attributes;")
                          .Skip(1)
                          .TakeWhile(entry => entry != ".")
                          .ToList();

如果列表中没有与字符串匹配的项,则第一个循环将导致
ArgumentOutOfRangeException
。在这种情况下,您将愉快地走过列表的末尾。您的第二个循环也有相同的问题

此外,我认为您必须在两个循环之间再增加一次
count
——目前您正在将项目
“Attributes;”“
添加到列表
TypeAndAmount
。这还将导致
ArgumentOutOfRangeException
,因为在空格处拆分字符串
“Attributes;”“
只会生成一个字符串,并且您正在访问上一个循环中的
类型[1]

我建议使用一些LINQ重写代码(包括跳过
“Attributes;”“
”项的步骤)

您还可以将所有内容都放在一条语句中—不太冗长,但更难调试

var typeAndAmount = Player.PlayerList
                          .SkipWhile(entry => entry != "Attributes;")
                          .Skip(1)
                          .TakeWhile(entry => entry != ".")
                          .ToList();

我发现一些可能导致异常的问题。在第一个循环中,需要检查并确保数组不是空的,并且需要有一个条件来检查数组大小,以防“Attributes”不存在。也许可以试试:

if (Player.PlayerList.Length > 0){
  do
  {
    count = count + 1;
  }while (count < Player.PlayerList.Length && Player.PlayerList[count] != "Attributes;");
if(Player.PlayerList.Length>0){
做
{
计数=计数+1;
}while(count
请注意,如果未找到属性,您可能应该抛出自己的异常。对于第二个循环,您需要添加类似的条件:

if (count < Player.PlayerList.Length){
  do
  {
      TypeAndAmount.Add(Player.PlayerList[count]);
      count = count + 1;
  } while (count < Player.PlayerList.Length && Player.PlayerList[count] != ".");
}
if(计数
请注意,这些方法只会阻止异常。如果您的列表没有按此方法所期望的方式排列,您仍然会遇到问题。

我发现有一些地方不对劲