crmepham
crmepham

Reputation: 4760

Attempting to output an IOrderedEnumerable list using C#

I have read in a .csv file, done some formatting, seperated each line into its columns and added the resulting arrays into a list of arrays of columns. Next I have ordered the list of arrays using IOrderedEnumerable to order it by the second column ascending alphabetically, then I attempt to out put this newly ordered list to the screen. Its the last part that am I stuck on.

This is what I have attempted:

// attempt to read file, if it fails for some reason display the exception error message
try
{
    // create list for storing arrays
    List<string[]> users = new List<string[]>();

    string[] lineData;
    string line;

    // read in stremreader
    System.IO.StreamReader file = new System.IO.StreamReader("dcpmc_whitelist.csv");
    // loop through each line and remove any speech marks
    while((line = file.ReadLine()) != null)
    {
        // remove speech marks from each line
        line = line.Replace("\"", "");

        // split line into each column
        lineData = line.Split(';');

        // add each element of split array to the list of arrays
        users.Add(lineData);

    }

    //sort this list by username ascending
    IOrderedEnumerable<String[]> usersByUsername = users.OrderBy(user => user[0]);

    // display the newly ordered list
    for (int i = 0; i <= users.Count; i++)
    {
        Console.WriteLine(usersByUsername[i]);
    }

    // after loading the list take user to top of the screen
    Console.SetWindowPosition(0, 0);
}
catch (Exception e)
{
    // Let the user know what went wrong when reading the file
    Console.WriteLine("The file could not be read:");
    Console.WriteLine(e.Message);
}

But this give the error:

cannot apply indexing with [] to an expression of type system.linq.iorderedenumerable

What is causing this error and how can I simply output the newly ordered list correctly?

Upvotes: 1

Views: 3068

Answers (1)

Andrei
Andrei

Reputation: 56716

The cause is neither IEnumerable nor IOrderedEnumerable support indexing, showing you the error.

To display the ordered result you can use foreach to enumerate the collection:

// display the newly ordered list
foreach (var user in usersByUsername)
{
    Console.WriteLine(string.Join(", ", user));
}

Or you can convert result to list and use indexing:

//sort this list by username ascending
IList<String[]> usersByUsername = users.OrderBy(user => user[0]).ToList();

// display the newly ordered list
for (int i = 0; i <= users.Count; i++)
{
    Console.WriteLine(string.Join(", ", usersByUsername[i]));
}

Also note the usage of string.Join - just printing string[] might not give you the result you expect.

Upvotes: 3

Related Questions