通过排序将数据存储在多维数组中

时间:2013-07-25 18:38:39

标签: c# sorting

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

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

5 个答案:

答案 0 :(得分:2)

您需要一次读取一行并将其拆分。使用StreamReader执行此操作。

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

答案 1 :(得分: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可能有一些聪明的方法,但你必须使用锯齿状数组(或nexted列表)作为中间步骤然后转换为矩形数组。

答案 2 :(得分: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()函数的一些更改。

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

答案 3 :(得分: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))

我不确定您要排序的内容或排序方式,因此无法指定您要查找的内容。第一种方法是最好的,因为它确定了值的排序方式不同,否则你必须为每个字段提出自己的排序方法,以便正确排序它们而不将它们转换为不同的对象。

答案 4 :(得分: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>();