C#继续在一行ForEach

时间:2013-08-07 10:29:33

标签: c# foreach continue

为什么我不能这样做?如何操纵代码?

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

4 个答案:

答案 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));