質問

ディレクトリ内の50個のファイルのうち8個のファイルのうち1つだけを実行すると、追加されます。

ファイルは0001,0002,0003,0004などのように名前が付けられています。

追加するファイルはこの順序であります.7,0,1,2,3,4,5,4,5,5は追加されなくなった。

私の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);
}
.

役に立ちましたか?

解決

これに似たコードを書きます:

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);
.

しかし私はそれをテストしていません。それでそれでもバグがあるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top