我有一个包含以下信息的文本文件:
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
答案 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>();