爲什麼我不能那樣做?如何操作代碼?C#在一行中繼續ForEach
System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf").ToList().ForEach(item => item.Contains("TOPRINT") ? continue : System.IO.File.Delete(item));
爲什麼我不能那樣做?如何操作代碼?C#在一行中繼續ForEach
System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf").ToList().ForEach(item => item.Contains("TOPRINT") ? continue : System.IO.File.Delete(item));
我以前ForEach
System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf")
.Where(item => !item.Contains("TOPRINT")).ToList()
.ForEach(f=> System.IO.File.Delete(f));
Linq是爲操作數據集而設計的 - 因此,所有查詢都必須返回一組數據。
你必須做這樣的事情,得到一組所需的數據:
foreach(var file in filesToDelete)
System.IO.File.Delete(file);
但這很容易閱讀! –
你的foreach通過'file'遍歷,但你刪除了'item' :) – Sayse
這是刪除所有包含「TOPRINT」的項目,而原始代碼段的意圖似乎是跳過這些文件。 –
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));
好的,謝謝,當然!file.Contains(「TOPRINT」);) – mati
請不要嘗試做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); }
請告訴我問題補充
where
? –我喜歡容易閱讀的代碼。 –
@MitchWheat我愛一行邏輯謎題;) –