C#矩形数组排序

时间:2010-11-27 12:10:48

标签: c# string sorting multidimensional-array

string[,] desc = new string[255,10];    
int descLines = 0;
cont string RDATAPATCH = "rctdata.xdb";
using (StreamReader sr = new StreamReader(RDATAPATCH))
{
      descLines = 0;
      while (sr.Peek() > -1)
      {
         sr.ReadLine();
         descLines++;
      }
      desc = new string[descLines, 10];
      int line = 0;
      sr.BaseStream.Position = 0;
      sr.DiscardBufferedData();
      while (sr.Peek() > -1)
      {
         string ltxt = sr.ReadLine();
         string[] lstxt = ltxt.Split('|');
         for (int x = 0; x < 10; x++)
         {
            desc[line, x] = lstxt[x];
         }
         line++;
      }
}
string[] sArray = new string[descLines];
for (int x = 0; x < descLines; x++)
{
   sArray[x] = desc[x, 7];
}
Array.Sort(sArray);
string[,] tempDesc = new string[descLines, 10];
for (int x = 0; x < sArray.Length; x++)
{
   for (int y = 0; y < desc.Length / 10; y++)
   {
      if (sArray[x] == desc[y, 7])
      {
         for (int z = 0; z < 10; z++)
         {
            tempDesc[x, z] = desc[y, z];
         }
      }
   }
}
desc = tempDesc;

我有这个代码,streamreader加载的文件是这样的:

id|rid|type|date opened|code|<0/1>|<number>|open date|availability('in stoc' or '11.11.2010'>|<0/1/2>
0|0|15fl*20ml/cut|04.2012|200905.101109|1|1|nedeschis|in stoc|2
1|0|15fl*20ml/cut|07.2012|200905.030210|1|1|nedeschis|in stoc|2
2|10|150 teste/cut|11.2012|16813A|1|3|nedeschis|in stoc|2
3|0|15fl*20ml/cut|06.2011|200905.050309|0|11|07.07.2010|in stoc|0

desc变量按打开日期字符串排序,可以是:'nedeschis'(已关闭)或'11 .11.2010'(日期)。 我认为我的算法错误,任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

我无法从问题中看出问题是什么,但请考虑切换到List<string[]>而不是string[,]。您不必两次读取文件;排序列表会更容易;并且你的算法问题可能会消失。

在.NET中,像string[,]这样的多维数组使用起来非常痛苦,因为大多数方法只适用于一维数组。您可以使用锯齿状数组(string[][])模拟2D数组。但是,在您的情况下,List<string[]>是更好的选择,因为您事先并不知道尺寸。

答案 1 :(得分:1)

算法似乎基本上是正确的,但是由于值被排序为字符串,结果将不按时间顺序排列。例如,字符串值“07.07.2010”大于“06.08.2010”。您必须将值转换为DateTime值才能正确比较它们。

此外,由于您在排序后使用日期值来标识项目,并且值不是唯一的,因此最终会出现一些项目的重复项并丢失其他项目。仍然可以以这种方式进行排序,但是您必须在排序后删除重复的值,并更改与值匹配的循环以处理重复的匹配。

您可以使用字符串数组列表而不是二维数组,这将使代码更简单。您可以一次性读取数据,并且可以对列表中的项目进行排序,而不是对特定值进行排序,然后匹配项目:

List<string[]> desc = new List<string[]>();
const string RDATAPATCH = "rctdata.xdb";
using (StreamReader sr = new StreamReader(RDATAPATCH)) {
  string line;
  while ((line = sr.ReadLine()) != null) {
    desc.Add(line.Split('|'));
  }
}
desc.RemoveAt(0); // remove field description line
desc.Sort((a, b) => {
  if (a[7] == "nedeschis" && b[7] == "nedeschis") return 0;
  if (a[7] == "nedeschis") return -1;
  if (b[7] == "nedeschis") return 1;
  return DateTime.Parse(a[7]).CompareTo(DateTime.Parse(b[7]));
});