1

我有一个包含以下信息的文本文件:

Sandy Princeton 12/24/2013 04.23pm
Crystalline Becker 10/23/2014 06.45pm
Madison Fernandez 01/29/2013 09.45pm
Kroner Mettigot 02/26/2013 10.32am

我编写了将信息读入的代码string[]

string[] MyArray = allText.Split( new string[]{" ",Environment.NewLine} ,
                     StringSplitOptions.RemoveEmptyEntries
                     ) ; 

我如何在多维数组中对以下信息进行排序和存储。控制台中的显示应如下所示。

Sandy Princeton       12/24/2013      04.23pm
Crystalline Becker    10/23/2014      06.45pm
Madison Fernandez     01/29/2013      09.45pm
Kroner Mettigot       02/26/2013      10.32am
4

5 回答 5

2

您需要一次阅读一行并将其拆分。使用 StreamReader 这样做。

我建议不要使用字符串数组,而是创建一个简单的容器类(名字、姓氏、日期、时间)。然后,您只需将您的行解析为该类的一个实例并将其添加到一个列表中。

于 2013-07-25T18:46:55.710 回答
0

如果它总是三列,您可以拆分每一行并逐个单元格填充二维数组:

string[,] My2DArray = new string[MyArray.Length,3];

for(int i = 0; i< MyArray.Length; i++)  
{
   string[] items = MyArray[i].Split(' ');
   My2DArray[i,0] = string.Join(" ",items.Take(items.Length-2).ToArray());
   My2DArray[i,1] = items[items.Length-2];
   My2DArray[i,2] = items[items.Length-1];
}

使用 Linq 可能有一些聪明的方法,但您必须使用锯齿状数组(或下一个列表)作为中间步骤,然后转换为矩形数组。

于 2013-07-25T18:56:03.627 回答
0
struct Info
{
    string firstName;
    string lastName;
    string date;
    string time;

    String override ToString()
    {
        StringBuilder result = new StringBuilder();
        result.Append(firstName + " ");
        result.Append(lastName + " ");
        result.Append(date + " ");
        result.Append(time + "\n");
        return result.ToString();
    }
}

一次读一行,分开' ',就像你已经在做的那样。您从 Split 返回的数组将按照您显示的顺序包含 4 个元素。只需制作一个 Info 对象,填充各个部分,当您再次写出它时,您只需要在所有 Info 对象上调用 ToString() 即可。

List<Info> lines = new List<Info>();
foreach(Info i in lines)
    Console.WriteLine(i.ToString());

当然,要获得所需的间距,您必须使用格式化的字符串,但这只是对 ToString() 函数所在位置的一些更改" "

这不是完整的解决方案,但它会让你开始。

于 2013-07-25T18:58:18.930 回答
0

如果您只需要该对象一次就可以创建一个匿名类,这将使您在代码中尝试做的事情更加清晰

var firstSplit = allText.Split(new[]{Environment.NewLine}, 
                            SplitOptions.RemoveEmptyEntries);
var dataLines = (from i in firstSplit
                 let currLine = i.Split(new[]{" "},SplitOptions.RemoveEmptyEntries)
                 select new 
                 {
                      FirstName = currLine [0],
                      LastName = currLine [1],
                      DateTime = DateTime.ParseExact(currLine[2]+currLine[3],
                                 "MM/dd/yyyy hh.mmtt")
                 }).OrderBy(s=>s.FirstName);

foreach(var line in dataLines)
    Console.WriteLine("{0} {1} {2}", line.FirstName,
                          line.LastName,
                          line.DateTime.ToString("MM/dd/yyyy hh.mmtt"));

或者您可以使用 linq 使用相同的方法选择一个锯齿状数组,然后对您要查找的任何字段进行排序,但前提是您要根据字母顺序进行排序。

var fsplt = allText.Split(new{Environment.NewLine},
        StringSplitOptions.RemoveEmptyEntries );
var dataLines = from line in fsplit
                let currLine = line.Split(new[]{" "},SplitOptions.RemoveEmptyEntries)
                orderby currLine[2] //order by the date
                select currLine

foreach(var line in dataLines)
    Console.WriteLine(string.Join(" ",line))

我不确定您要按什么排序或如何排序,因此无法指定您要查找的内容。第一种方法是最好的,因为它确定值应该以不同的方式排序,否则您必须为每个字段提供自己的排序方法才能正确排序它们而不将它们转换为不同的对象。

于 2013-07-25T19:01:59.733 回答
0

像这样声明一个类

public class Test
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public DateTime dateTime { get; set; }
}

然后写一个这样的方法

List<Test> t = new List<Test>();
using (StreamReader sr = new StreamReader("YourFilePath"))
{
     string line = string.Empty;
     while ((line = sr.ReadLine()) != null)
     {
          string[] lines = line.Split(' ').ToArray();
          //add to your list
          t.Add(new Test() { firstName = lines[0], lastName = lines[1], dateTime = DateTime.ParseExact("MM/dd/yyyy hh:mm:ss tt", lines[2] + lines[3], CultureInfo.InvariantCulture) });
     }
}
//Your Ordered list now
t = t.OrderBy(x => x.dateTime).ToList<Test>();
于 2013-07-25T19:03:22.663 回答