2010-11-27 104 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