Lewis
Lewis

Reputation: 656

Looping through a string array to create class variables of those strings

So I have this code in a .cs file called SchoolData that has a class and a list.

public static List<YearGroupsData> yearGroupsDataList = new List<YearGroupsData>();

public class YearGroupsData
{
    public int id { get; set; }
    public int year { get; set; }
    public string groupName { get; set; }
    public int subject { get; set; }
}

However, I'm trying to use a loop in another .cs script that does a web connection and gets the data from the website, I haven't included the connection info or some of the script for that as this isn't the part going wrong...

private IEnumerator ViewYearGroups()
{
   //Some code for connection here
    yield return viewYearGroups;
    string yearGroupsDataString = viewYearGroups.text;
    yearGroups = yearGroupsDataString.Split(';');


    foreach (string yearGroup in yearGroups)
    {
        YearGroupsData yearGroupsData = new YearGroupsData()
        {
            id = Int32.Parse(GetDataValue(yearGroup, "Id:")),
            year = Int32.Parse(GetDataValue(yearGroup, "Year:")),
            groupName = GetDataValue(yearGroup, "GroupName:"),
            subject = Int32.Parse(GetDataValue(yearGroup, "Subject:")),
        };
        SchoolData.yearGroupsDataList.Add(yearGroupsData);
    }
}

The GetDataValue is the part that is messing up. It gives me ArgumentOutOfRangeException and I'm not sure why. It works if I'm not using it in a loop, I've tried a for loop as well and still the same, anyone know what's happening?

public string GetDataValue(string data, string index)
{
    string value = data.Substring(data.IndexOf(index) + index.Length);
    if (value.Contains("|"))
    {
        value = value.Remove(value.IndexOf("|"));
    }
    return value;
}

Upvotes: 1

Views: 75

Answers (3)

Milad jalali
Milad jalali

Reputation: 163

the ArgumentOutOfRangeException happen when the value of an argument is outside the allowable range of values as defined by the invoked method

try this:

string value = data.Substring(data.IndexOf(index) + index.Length - 1 );

Upvotes: 1

Lewis
Lewis

Reputation: 656

Where I used the .Split to divide the string at each semicolon was the issue. The string I was splitting had a space after the last semicolon which was creating an empty index from that. I used yearGroups = yearGroups.Take(yearGroups.Count() - 1).ToArray();

to remove the last index that was empty. The trycatch method helped me find this, thanks.

Upvotes: 1

Casey Balza
Casey Balza

Reputation: 162

Add a try catch in your GetDataValue() method to help with debugging. If it works without the foreach loop, then my guess is one of the string objects you are iterating over is different than what you may be expecting. https://msdn.microsoft.com/en-us/library/system.argumentoutofrangeexception(v=vs.110).aspx

try
{
    string value = data.Substring(data.IndexOf(index) + index.Length); 
}
catch (ArgumentOutOfRangeException e) 
{
     Console.WriteLine(e.Message);
}

Upvotes: 2

Related Questions