0

代码:

while ((linevalue = filereader.ReadLine()) != null)
{
      items.Add(linevalue);
}
filereader.Close();
items.Sort();
//To display the content of array (sorted)
IEnumerator myEnumerator = items.GetEnumerator();
while (myEnumerator.MoveNext())
{
    Console.WriteLine(myEnumerator.Current);
}

上面的程序显示了所有的值。如何仅提取日期并按升序对其进行排序?


我不允许使用 linq、使用异常或线程或任何其他东西。我必须坚持使用文件流,尝试从文本文件中取出我的数据,对其进行排序和存储,以便我可以检索、查看和编辑它并搜索任何特定日期并查看加入记录的日期为那个日期。想不通。苦苦挣扎

4

4 回答 4

4

基本上,不要尝试将文件作为文本行来处理;将其分开,这样您就有一段代码将该文本解析为类型化记录,然后在您只需要处理类型化数据时处理这些上游。

例如(在这里我假设文件是​​制表符分隔的,但您可以很容易地将其更改为列索引);看看我的方法需要做多少工作来处理数据:Main

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
static class Program
{
    static void Main()
    {
        foreach (var item in ReadFile("my.txt").OrderBy(x => x.Joined))
        {
            Console.WriteLine(item.Names);
        }
    }
    static readonly char[] tab = { '\t' };
    class Foo
    {
        public string Names { get; set; }
        public int Age { get; set; }
        public string Designation { get; set; }
        public DateTime Joined { get; set; }
    }
    static IEnumerable<Foo> ReadFile(string path)
    {
        using (var reader = File.OpenText(path))
        {
            // skip the first line (headers), or exit
            if (reader.ReadLine() == null) yield break;

            // read each line
            string line;
            var culture = CultureInfo.InvariantCulture;
            while ((line = reader.ReadLine()) != null)
            {
                var parts = line.Split(tab);
                yield return new Foo
                {
                    Names = parts[0],
                    Age = int.Parse(parts[1], culture),
                    Designation = parts[2],
                    Joined = DateTime.Parse(parts[3], culture)
                };
            }
        }
    }
}

这是一个仅使用 ISO-1 语言功能在 .NET 2.0(也可能在 .NET 1.1)上工作的版本(不是很优雅,但可以工作);我个人认为使用 .NET 1.1 会很愚蠢,如果您使用的是 .NET 2.0,那么List<T>将比 .NET 更可取ArrayList。但这是“最坏的情况”:

using System;
using System.Collections;
using System.Globalization;
using System.IO;
class Program
{
    static void Main()
    {
        ArrayList items = ReadFile("my.txt");
        items.Sort(FooByDateComparer.Default);
        foreach (Foo item in items)
        {
            Console.WriteLine(item.Names);
        }
    }
    class FooByDateComparer : IComparer
    {
        public static readonly FooByDateComparer Default
            = new FooByDateComparer();
        private FooByDateComparer() { }
        public int Compare(object x, object y)
        {
            return ((Foo)x).Joined.CompareTo(((Foo)y).Joined);
        }
    }

    static readonly char[] tab = { '\t' };
    class Foo
    {
        private string names, designation;
        private int age;
        private DateTime joined;
        public string Names { get { return names; } set { names = value; } }
        public int Age { get { return age; } set { age = value; } }
        public string Designation { get { return designation; } set { designation = value; } }
        public DateTime Joined { get { return joined; } set { joined = value; } }
    }
    static ArrayList ReadFile(string path)
    {
        ArrayList items = new ArrayList();
        using (StreamReader reader = File.OpenText(path))
        {
            // skip the first line (headers), or exit
            if (reader.ReadLine() == null) return items;

            // read each line
            string line;
            CultureInfo culture = CultureInfo.InvariantCulture;
            while ((line = reader.ReadLine()) != null)
            {
                string[] parts = line.Split(tab);
                Foo foo = new Foo();
                foo.Names = parts[0];
                foo.Age = int.Parse(parts[1], culture);
                foo.Designation = parts[2];
                foo.Joined = DateTime.Parse(parts[3], culture);
                items.Add(foo);
            }
        }
        return items;
    }
}
于 2013-07-30T09:25:54.413 回答
0

我不确定您为什么只想检索日期。您最好先将数据读入元组。就像是

List<Tuple<string, int, string, DateTime>> items. 

然后您可以按 items.Item4 对它们进行排序,这将是日期。

于 2013-07-30T09:21:29.013 回答
0

从文件中获取 Array 中所需的值...

public class DateComparer : IComparer {
  public int Compare(DateTime x, DateTime y) {
    if(x.Date > y.Date)
         return 1;
    if(x.Date < y.Date)
         return -1;
    else
         return 0;
  }
}
list.Sort(new DateComparer());
于 2013-07-30T09:25:37.750 回答
0

您可以使用 LINQ 并根据选项卡拆分行以仅检索日期并通过转换为日期对其进行排序。

while ((linevalue = filereader.ReadLine()) != null)
    {
          items.Add(linevalue.Split('\t').Last());
    }
    filereader.Close();
    items.OrderBy(i => DateTime.Parse(i));
    foreach(var item in items)
    {
        Console.WriteLine(item);
    }
于 2013-07-30T09:25:57.580 回答