2013-11-28 2 views
0

используя ...увеличивающиеся размеры в списке

string[] myFiles = Directory.GetFiles(FilePathIn, "*.dat", SearchOption.TopDirectoryOnly); 

Я получаю список файлов возвращается. Наряду с этим я хочу сохранить набор флагов int. Я собираюсь сделать это, создав список кортежей, например List<Tuple<int, string>>, затем перейдя через myfiles, добавив каждый в список кортежей.

Хотя это будет работать, я задавался вопросом, был ли более чистый способ сделать это? Он не обязательно должен быть списком кортежей. Он просто должен быть упорядоченный список файлов с флагом

+0

Спасибо за все предложения. Варианты явно многочисленны. Я буду играть с ними и посмотреть, что работает. Просто для уточнения: файлы будут обрабатываться в циклах после каждого цикла, некоторые из файлов будут удалены. В конце процесса я перечисляю файлы в порядке наилучшего соответствия, соответствующего наихудшему. –

ответ

0

Почему вы не используете словарь для доступа к элементу в словаре будет стоить O (1)

Dictionary<int,string> myFilesOrderedDict = new Dictionary<int,string>(); 

Или, если вы хотите к groupfile с помощью междунар в качестве флага вы можете сделать обратное, поскольку я не думаю, что имя файла может быть повторен дважды

что-то вроде этого
// строка будет имя файла

Dictionary<string ,int> myFilesOrderedDict = new Dictionary<string,int>(); 

Надеется, что это поможет

0

Если вы заинтересованы в только итерациях то список некоторого типа соединения является путем - вы можете использовать пользовательские struct вместо Tuple увеличить читаемость или обычай class если вы намерены позже менять флаги, но общая идея одинаков.

Вы также можете использовать имена файлов с именами Dictionary<string, int>; это имеет то преимущество, что позволяет быстро выполнять поиск, если у вас есть имя файла в руке.

Наконец, рассмотрите возможность использования [Flags]enum вместо целого целого, чтобы удерживать нужные флаги.

0

В зависимости от того, как вы хотите использовать данные позже, я либо сопоставил бы имена файлов с целыми числами (Dictionary<string, int>), либо целыми числами. Я предполагаю, что два файла могут иметь один и тот же флаг, поэтому я бы использовал либо Dictionary<int, List<string>>, либо constuct IGrouping<int, string> или ILookup<int, string>. Поразительно, что .NET BCL не содержит простой изменчивый Multimap (или Lookup), который можно использовать как словарь.

0

Вы можете создать anonymous type:

var filesWithFlags = Directory.GetFiles(..) 
           .Select(f => new {File = f, Flags = 123}); 

И использовать результат, как этот:

foreach (var fileWithFlags in filesWithFlags) 
{ 
    DoSomethingWith(fileWithFlags.File); 
    AndDoSomethingWith(fileWithFlags.Flags); 
} 
Смежные вопросы