2011-05-20 47 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); 

但我没有测试它。所以它可能仍然有错误。