2014-12-01 57 views
1

我有一個壓縮文件列表,其中包含一個ZipArchive和壓縮的filename as a String。我也有我需要檢查我的列表的文件名的最終列表,如果文件不匹配我的文件名的最終列表,他們應該從我的壓縮文件列表中轉儲。查找變量名數組中是否不存在文件名

我站在那可能不是最好的措辭,所以讓我嘗試解釋我的代碼/僞代碼。

這裏是我的清單:

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 

} 

註釋掉部分是什麼我不確定這樣做。有人能夠幫助我走上正軌嗎?謝謝!

編輯1

我知道我最初沒有說,但我認爲LINQ將採取更清潔的路線。我只是不積極如何。我假設使用.RemoveAll(..)將是我想要去的方式?

回答

0

你可以這樣做:

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

另外,我相信你可以使用LINQ簡化這個邏輯逼到一條線。

編輯:

是的,你可以創建你想要的那些,像這樣的一個新的列表:

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

這正是我要寫的。如果這不是你的答案,我相信它會讓你走上正軌。 – 2014-12-01 18:49:53

+0

我喜歡你用'.Remove()'解決我的問題的方式,但是如果有很多內容,然後一個被刪除並且順序改變,這會在我的列表中導致問題嗎? – scapegoat17 2014-12-01 19:01:45

+0

如果您要從列表中刪除項目,那麼無論您做什麼,它都會發生變化。使用.remove()應該保留順序,但只是刪除有問題的項目。但是,正如在另一個答案中指出的那樣,這可能會通過修改您在foreach中迭代的列表而導致問題。我建議更好的方法是使用Linq,就像我編輯的代碼一樣。 – Redit0 2014-12-01 20:33:01

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,因爲它修改集,就無法刪除列表中的項目,但你可以在我的例子中,結構做。

相關問題