0
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);
   }
}

我的程序需要故障排除。这个程序,我实际上是由一个聪明的人从 SO 那里得到的,但我无法追溯。我不知道怎么了。我希望存储在我的文本文件中的所有内容都通过数组列表进行存储和显示。任何帮助,将不胜感激。

它显示但不正确。我的文本文件有以下详细信息

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

它不是以相同的方式显示它,而是显示为

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

4 回答 4

3

问题是您linevalue在添加项目之前再次阅读:

你可以用更简单的方法来做到这一点:

  var lines = File.ReadAllLines("Scheduler.txt").ToList();
  lines.Sort();
  foreach(var line in lines)  Console.WriteLine( line );
于 2013-08-07T10:40:17.200 回答
0

尝试这个:

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

更简单的方法:

// store your items
ArrayList items =
    new ArrayList(File.ReadAllLines("Scheduler.txt").ToArray());
// output them, eventually
items.ToArray().ToList().ForEach(item =>
{
    Console.WriteLine(item);
});
于 2013-08-07T10:40:19.317 回答
0
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);
   }
}
于 2013-08-07T10:40:27.110 回答
0

问题是标题行是一行,所以它与其他行排序。有多种方法可以解决这个问题......在另一个变量中单独读取标题行而不添加到,在排序之前ArrayList从第一行删除,只对第一行之后的行进行排序......我选择了最后一个和ArrayList写了一些变体来展示如何编写代码。

第一级,不对第一行进行排序,并且使用using关键字,而不是手动关闭文件。

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);
}

第二层,请忘记ArrayList……这是一个没有文字的世界的孩子……我希望有一天我们能够忘记那个世界。并使用GetEnumerator手动?有foreach( 或, 是这些东西for的集合和ArrayList/ 。更好,因为我们必须跳过第一行。List<string>for

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]);
}

然后我们可以删除FileStream,因为StreamReader有一个足够好的构造函数......

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

或者我们可以直接使用File.ReadAllLines返回数组的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]);
}

for或者,我们可以使用一点 LINQ来代替:

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

并使用Skip方法跳过第一行(LINQ的这些行兼容所有不使用的版本ArrayList

于 2013-08-07T11:36:33.170 回答