2013-08-07 36 views
1

爲什麼我不能那樣做?如何操作代碼?C#在一行中繼續ForEach

System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf").ToList().ForEach(item => item.Contains("TOPRINT") ? continue : System.IO.File.Delete(item)); 
+0

請告訴我問題補充where? –

+2

我喜歡容易閱讀的代碼。 –

+0

@MitchWheat我愛一行邏輯謎題;) –

回答

0

我以前ForEach

System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf") 
     .Where(item => !item.Contains("TOPRINT")).ToList() 
     .ForEach(f=> System.IO.File.Delete(f)); 
2

Linq是爲操作數據集而設計的 - 因此,所有查詢都必須返回一組數據。

你必須做這樣的事情,得到一組所需的數據:

foreach(var file in filesToDelete) 
    System.IO.File.Delete(file); 
+0

但這很容易閱讀! –

+0

你的foreach通過'file'遍歷,但你刪除了'item' :) – Sayse

+0

這是刪除所有包含「TOPRINT」的項目,而原始代碼段的意圖似乎是跳過這些文件。 –

0
System.IO.Directory.GetFiles(
    @"..\DATA\data", "*.pdf"). 
    ToList(). 
    ForEach(
     item => 
     { 
      if (item.Contains("TOPRINT")) 
       System.IO.File.Delete(item); 
     } 
    ); 

或:

var filesToDelete = System.IO.Directory 
    .GetFiles(@"..\DATA\data", "*.pdf") 
    .Where(item => !item.Contains("TOPRINT")); 

然後在返回的數據集進行操作

(from file in System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf") 
where file.Contains("TOPRINT") 
select file).ToList().ForEach(item => System.IO.File.Delete(item)); 
+0

好的,謝謝,當然!file.Contains(「TOPRINT」);) – mati

1

請不要嘗試做g你嘗試做什麼,不要這樣做:

System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf") 
    .Where(p => p.Contains("TOPRINT")) 
    .All(p => { System.IO.File.Delete(p); return true; }); 

LINQ表達式應該是無副作用的。刪除文件肯定是一個副作用。 List<T>ForEach方法在概念上是錯誤的(LINQ時代之前的孩子)。爲了使用ForEach而在List<T>中轉換數組在概念上是雙重錯誤的。我至少寫的只是「單獨」的概念錯誤。 (但它會工作)。

啊...並做什麼戴夫比什建議! foreach是適合副作用的地方!

只記得他的filesToDelete會被懶惰地解析,所以如果你在兩個foreach中枚舉兩次,Contains檢查將會執行兩次!

這個考慮,在Array類中有很多強大的靜態方法。沒有人使用它們是可惜的。

var filesToDelete = System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf"); 
filesToDelete = Array.FindAll(filesToDelete, p => p.Contains("TOPRINT")); 

Array.ForEach(filesToDelete, System.IO.File.Delete); // or 
// Array.ForEach(filesToDelete, p => System.IO.File.Delete(p));    
// or, better, foreach (var file in filesToDelete) { System.IO.File.Delete(file); }