2010-11-27 5 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#矩形アレイがソート

DESC変数がオープン日付列によってソートされることができ
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値に変換する必要があります。

また、並べ替え後のアイテムを識別するために日付値を使用していて、値が一意でない場合、一部のアイテムの重複が発生し、他のアイテムが失われます。このようにソートを行うことは可能ですが、ソート後に重複値を削除し、重複マッチを処理する値に一致するループを変更する必要があります。

2次元配列の代わりに文字列配列のリストを使用すると、コードをもっと簡単にすることができます。あなたは、単一のパスでデータを読み取ることができ、あなたが代わりに特定の値をソートのリストの項目をソートして、アイテムを一致させることができます:

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

質問から問題を特定することはできませんが、string[,]の代わりにList<string[]>に切り替えることを検討してください。ファイルを2度読む必要はありません。あなたのリストを並べ替える方が簡単です。アルゴリズムの問​​題が解消する可能性があります。

string[,]のような多次元配列は、ほとんどの方法が1次元配列でしか機能しないため、扱いにくいです。ギザギザの配列(string[][])で2D配列をシミュレートできます。しかし、あなたのケースでは、事前にサイズを知らないので、List<string[]>がより良い選択になります。

+0

私はこの事で新しいですあなたは私のデモを与えることができます。 ..私は少しプロジェクトのこの変更は、私は非常に多くのコードを変更することができます...私はあなたが私を助ける時間があれば...私は何を意味するかを見るためにすべてのプロジェクトを与えることができます:D ...そして速い応答のためのありがとう...あなたが私とチャットするために私にヤフーIDを与えることができますか?もう一度、ありがとう。私の英語のために申し訳ありません – Sp3ct3R

+0

例の@ Guffaの答えを見てみましょう –