#c# #icomparer #sortedset #generic-collections
#c# #icomparer #sortedset #общие коллекции
Вопрос:
Когда я запускаю приведенный ниже код, добавляются только 8 из 50 файлов в каталоге.
Файлы называются как 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);
}
Комментарии:
1. И где код для
AL3SequenceComparer
? Довольно очевидно, что ошибка именно там.
Ответ №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);
Но я это не тестировал. Так что в нем все еще могут быть ошибки.