1

Why I can't do that ? How to manipulate code ?

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

4 回答 4

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);
于 2013-08-07T10:32:07.407 回答
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 时代的孩子)。将数组转换为 aList<T>只是为了使用在ForEach概念上是双重错误的。我至少写的只是概念上的“单一”错误。(但它会工作)。

啊……按照戴夫·比什的建议去做!foreach是副作用的正确位置!

只要记住 hisfilesToDelete会被懒惰地解析,所以如果你将它一分为二枚举两次foreachContains检查将被执行两次!

考虑到这一点,类中有许多强大的静态方法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); }
于 2013-08-07T10:35:31.193 回答
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));
于 2013-08-07T10:35:05.343 回答
0

我会在where之前添加ForEach

System.IO.Directory.GetFiles(@"..\DATA\data", "*.pdf")
      .Where(item => !item.Contains("TOPRINT")).ToList()
      .ForEach(f=> System.IO.File.Delete(f));
于 2013-08-07T10:38:50.050 回答