为什么我不能这样做?如何操纵代码?
System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf").ToList().ForEach(item => item.Contains("TOPRINT") ? continue : System.IO.File.Delete(item));
答案 0 :(得分:2)
Linq旨在对数据集进行操作 - 因此,所有查询都必须返回一个集合。
你必须做这样的事情,以获得一组所需的数据:
var filesToDelete = System.IO.Directory
.GetFiles(@"..\DATA\data", "*.pdf")
.Where(item => !item.Contains("TOPRINT"));
然后对返回的数据集进行操作:
foreach(var file in filesToDelete)
System.IO.File.Delete(file);
答案 1 :(得分:1)
请不要尝试做你尝试过的事情,不要这样做:
System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf")
.Where(p => p.Contains("TOPRINT"))
.All(p => { System.IO.File.Delete(p); return true; });
LINQ表达式应该是无副作用的。删除文件肯定是副作用。 ForEach
List<T>
方法在概念上是错误的(LINQ之前的孩子)。转换List<T>
中的数组只是为了使用ForEach
,这在概念上是错误的。我写的至少只是“单身”在概念上是错误的。 (但它会起作用)。
啊......做Dave Bish建议的事情! 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); }
答案 2 :(得分:0)
System.IO.Directory.GetFiles(
@"..\DATA\data", "*.pdf").
ToList().
ForEach(
item =>
{
if (item.Contains("TOPRINT"))
System.IO.File.Delete(item);
}
);
或
(from file in System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf")
where file.Contains("TOPRINT")
select file).ToList().ForEach(item => System.IO.File.Delete(item));
答案 3 :(得分:0)
我会在where
ForEach
System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf")
.Where(item => !item.Contains("TOPRINT")).ToList()
.ForEach(f=> System.IO.File.Delete(f));