2014-12-01 3 views
1

У меня есть список zipped файлов, который содержит ZipArchive и zipped filename as a String. У меня также есть окончательный список имен файлов, которые мне нужно проверить с моим списком, и если файлы не совпадают с моим окончательным списком имен файлов, они должны быть сброшены из моего списка zipped-файлов.Найти, если имя файла не существует в массиве имен переменных

Я подставку, которая не может быть сформулирована лучше, поэтому позвольте мне попробовать и объяснить с помощью моего кода/псевдокода.

Вот мой список:

List<ZipContents> importList = new List<ZipContents>(); 

Который имеет два параметра:

  1. ZipArchive который называется ZipFile
  2. String, который называется FileName

filenames это финал список имен файлов, которые я пытаюсь проверить мой список ZipContents против.

Вот начало того, что я пытаюсь сделать:

foreach (var import in importList) 
{   
    var fn = import.FileName; 

    // do some kind of lookup to see if fn would be List<String> filenames 
    // If not in list dump from ZipContents 

} 

Закомментированный из раздела является то, что я не уверен, о выполнении. Кто-нибудь сможет помочь мне на правильном пути? Благодаря!

EDIT 1

Я знаю, что я не говорю об этом изначально, но я думаю, что LINQ будет гораздо чище маршрут принять. Я просто не уверен, как это сделать. Я предполагаю, что использование .RemoveAll(..) будет таким, каким я хотел бы пойти?

ответ

0

Вы могли бы сделать что-то вроде:

if (!filenames.Contains(fn)) { 
    importList.Remove(import); 
} 

В качестве альтернативы, я полагаю, вы могли бы использовать Linq, чтобы упростить эту логику в одну строку.

Edit:

Да, вы можете просто создать новый список только те, которые вы хотите, как это:

var newImportList = importList.Where(il => filenames.Contains(il.FileName)).ToList(); 
+0

Это именно то, что я собирался написать.Если это не ваш ответ, я верю, что он должен помочь вам на правильном пути. –

+0

Мне нравится, как вы решили мою проблему с выполнением '.Remove()', но будет ли это причиной проблемы в моем списке, если есть много содержимого, а затем удаляется и порядок изменяется? – scapegoat17

+0

Если вы собираетесь удалять элементы из списка, это изменится независимо от того, что вы делаете. Использование .remove() должно сохранить порядок, но просто удалите этот предмет. Однако, как было указано в другом ответе, это может вызвать проблемы, изменяя список, который вы повторяете в своем foreach. Я бы предположил, что лучшим подходом будет использование Linq, как в коде из моего редактирования. – Redit0

0

Вы можете сделать это в одной строке. Просто используйте LINQ, чтобы восстановить свой список:

var filenames = new List<string> {"file1", "file2"}; 
var zipcontents = new List<ZipContents> 
{ 
    new ZipContents {FileName = "file1"}, 
    new ZipContents {FileName = "file2"}, 
    new ZipContents {FileName = "file3"} 
}; 

zipcontents = zipcontents.Where(z => filenames.Contains(z.FileName)).ToList(); 

//zipcontents contains only files that were in 'filenames' 

Честно говоря, это то, что LINQ было сделано для: запроса данных.

0

Петля через importList в обратном направлении и удалять предметы, если они не найдены в filenames. Предполагая, что вы не слишком много производительности элементов должна быть хорошо:

for (int i = importList.Count - 1; i >= 0; i--) 
{ 
    if (!filenames.Contains(importList[i].FileName)) 
    { 
     importList.RemoveAt(i); 
    } 
} 

Вы не можете удалять элементы из списка, используя foreach, потому что он изменяет коллекцию, но вы можете сделать это с помощью конструкции в моем примере ,

Смежные вопросы