Polimer Likiner
Polimer Likiner

Reputation: 9

How To Make this Code work

static void Main()
{
   FileStream fs = new FileStream("Scheduler.txt",FileMode.Open, FileAccess.Read);
   StreamReader filereader = new StreamReader(fs);
   string linevalue = "";
   ArrayList items = new ArrayList();
   while ((linevalue = filereader.ReadLine()) != null)
   {
       items.Add(linevalue);
   }
   filereader.Close();
   items.Sort();
   IEnumerator myEnumerator = items.GetEnumerator();
   while (myEnumerator.MoveNext())
   {
       Console.WriteLine(myEnumerator.Current);
   }
}

My program needs trouble shooting. This program, i actually got it from SO by a brilliant guy but i am not able to trace back. I don't know what's wrong. I want everything that is stored in my text file to be stored and displayed through the array list. Any help would be appreciated.

It get's displayed but incorrectly. My Text File has got the following details

       Names            Date           Time
       Leon             13/10/2013     10:00AM
       Jyothika         18/10/2013     12:18PM
       Angelina         21/09/2000     01:45AM

Instead of displaying it in the same manner, it displays like

       Angelina          21/09/2000     01:45AM
       Names             Dates          Time
       Leon              13/10/2013     10:00AM
       Jyothika          18/10/2013     12:18PM

Upvotes: 0

Views: 122

Answers (4)

xanatos
xanatos

Reputation: 111940

The problem is that the Title Line is a line, so it gets sorted with the other lines. There are various ways to solve this problem... Read the Title Line separately in another variable and not adding to the ArrayList, remove from the ArrayList the first row before sorting, sort only the rows after the first... I chose the last one and wrote some variants that show how the code could be written.

First level, not sort the first row, and using the using keyword, instead of manually closing the files.

ArrayList items = new ArrayList();

using (FileStream fs = new FileStream("Scheduler.txt", FileMode.Open, FileAccess.Read))
using (StreamReader filereader = new StreamReader(fs))
{
    string linevalue = string.Empty;

    while ((linevalue = filereader.ReadLine()) != null)
    {
        items.Add(linevalue);
    }
}

Console.WriteLine(items[0]);
items.Sort(1, items.Count - 1, StringComparer.CurrentCulture);

IEnumerator myEnumerator = items.GetEnumerator();
myEnumerator.MoveNext(); // skip the first row

while (myEnumerator.MoveNext())
{
    Console.WriteLine(myEnumerator.Current);
}

Second level, please forget of ArrayList... It's a child of a pre-literate world... I hope one day we will be able to forget that world. And using the GetEnumerator manually? There is the foreach (or the for, being the collection an ArrayList/List<string> for these things. The for is better, because we must skip the first row.

var items = new List<string>();

using (FileStream fs = new FileStream("Scheduler.txt", FileMode.Open, FileAccess.Read))
using (StreamReader filereader = new StreamReader(fs))
{
    string linevalue = string.Empty;

    while ((linevalue = filereader.ReadLine()) != null)
    {
        items.Add(linevalue);
    }
}

Console.WriteLine(items[0]);
items.Sort(1, items.Count - 1, StringComparer.CurrentCulture);

for (int i = 1; i < items.Count; i++) 
{
    Console.WriteLine(items[i]);
}

Then we could remove the FileStream, because the StreamReader has a good-enough constructor...

using (StreamReader filereader = new StreamReader("Scheduler.txt"))

Or we could directly use the File.ReadAllLines that returns an array of string[].

string[] items = File.ReadAllLines("Scheduler.txt");

Console.WriteLine(items[0]);
Array.Sort(items, 1, items.Length - 1, StringComparer.CurrentCulture);

for (int i = 1; i < items.Length; i++) 
{
    Console.WriteLine(items[i]);
}

or, instead of the for, we could use a little LINQ:

foreach (string item in items.Skip(1))
{
    Console.WriteLine(item);
}

and use the Skip method to skip the first row (these lines of LINQ are compatible with all the versions that don't use ArrayList)

Upvotes: 0

Blau
Blau

Reputation: 5762

The problem is your reading linevalue again before adding to items:

You can do it in an easier way:

  var lines = File.ReadAllLines("Scheduler.txt").ToList();
  lines.Sort();
  foreach(var line in lines)  Console.WriteLine( line );

Upvotes: 3

Taj
Taj

Reputation: 1728

static void Main()
{
   FileStream fs = new FileStream("Scheduler.txt",FileMode.Open, FileAccess.Read);
   StreamReader filereader = new StreamReader(fs);
   string linevalue = "";
   ArrayList items = new ArrayList();
   while ((linevalue = filereader.ReadLine()) != null)
   {
       //linevalue = filereader.ReadLine();
       items.Add(linevalue);
   }
   filereader.Close();
   items.Sort();
   IEnumerator myEnumerator = items.GetEnumerator();
   while (myEnumerator.MoveNext())
   {
       Console.WriteLine(myEnumerator.Current);
   }
}

Upvotes: 0

Alex Filipovici
Alex Filipovici

Reputation: 32571

Try this:

while ((linevalue = filereader.ReadLine()) != null)
{
    //linevalue = filereader.ReadLine();
    items.Add(linevalue);
}

An easier way:

// store your items
ArrayList items =
    new ArrayList(File.ReadAllLines("Scheduler.txt").ToArray());
// output them, eventually
items.ToArray().ToList().ForEach(item =>
{
    Console.WriteLine(item);
});

Upvotes: 0

Related Questions