2010-11-27 44 views
3
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的负载是这样的文件:C#矩形数组排序

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 

的递减变量由开放日期字符串排序,并且可以是:“nedeschis”(闭合)或'11.11.2010'(日期)。 我认为我的算法是错的,任何人都可以帮助我?

回答

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])); 
}); 
1

我无法从问题中发现问题所在,但请考虑切换到List<string[]>而不是string[,]。您不必阅读文件两次;整理你的清单将会更容易;你的算法问题可能会消失。

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

+0

我是新在这个东西,你可以给我演示。 ..我在项目中有点进一步,这种改变可以让我修改非常多的代码...我可以给你所有的项目,看看我的意思是...如果你有时间来帮助我:D ...并感谢您的快速反应...可以哟给我一个雅虎ID与您聊天吗?再次感谢。对不起,我的英语 – Sp3ct3R 2010-11-27 12:27:25