2011-05-20 80 views
0

當我運行下面的代碼時,只有目錄中的50個文件中的8個被添加。SortedSet添加混淆

這些文件被命名爲喜歡0001,0002,0003,0004,等

是被添加在此訂單的文件:7,0,1,2,3,4,5,6項時不再添加。

看看我的SortedSet的最小值和最大值分別是6和7。

我想我的問題是否有更好的方法來做到這一點或一種方法來獲得下面的代碼做我想做的事情。更具體地說,我希望文件路徑字符串根據文件中的解析值在集合中排序。

string[] files = System.IO.Directory.GetFiles(textBox1.Text); 

SortedSet<string> ascending = new SortedSet<string>(new MyComparer()); 

foreach (string f in files) 
{ 
    bool added = ascending.Add(f); 
} 

//Compares values in file format 
//MyComparer.Compare: 
using (FileStream fsx = new FileStream(x, FileMode.Open, FileAccess.Read, FileShare.Read)) 
using (FileStream fsy = new FileStream(y, FileMode.Open, FileAccess.Read, FileShare.Read)) 
using (StreamReader rx = new StreamReader(fsx)) 
using (StreamReader ry = new StreamReader(fsy)) 
{ 
    //the first 6 bytes represent a number 
    char[] buffx = new char[6], buffy = new char[6]; 
    rx.Read(buffx, 0, 6); 
    ry.Read(buffy, 0, 6); 

    int nx, ny; 
    if (!int.TryParse(new String(buffx), out nx)) 
     throw new Exception("Wtf?"); 
    if (!int.TryParse(new String(buffy), out ny)) 
     throw new Exception("Wtf?"); 

    return Comparer<int>.Default.Compare(nx, ny); 
} 
+0

「AL3SequenceComparer」的代碼在哪裏?很明顯,該錯誤在那裏。 – CodesInChaos 2011-05-20 22:18:09

回答

1

我會寫類似這樣的代碼:

int GetFileContentNumber(string filename) 
{ 
    using(var reader=new StreamReader(filename) 
    { 
    char[] chars=new char[6]; 
    reader.Read(buf, 0, 6); 
    return int.Parse(new String(chars)); 

    } 
} 

IEnumerable<string> files = System.IO.Directory.GetFiles(textBox1.Text) 
    .Select(filename=>new KeyValuePair<string,int>(filename, GetFileContentNumber(filename))) 
    .OrderBy(pair=>pair.Value) 
    .Select(pair=>pair.Key); 

但我沒有測試它。所以它可能仍然有錯誤。