4

我想做类似的事情

Action<FileInfo> deleter = f =>
    {
        if (....) // delete condition here
        {
            System.IO.File.Delete(f.FullName);
        }
    };

DirectoryInfo di = new DirectoryInfo(_path);

di.GetFiles("*.pdf").Select(deleter); // <= Does not compile!
di.GetFiles("*.txt").Select(deleter); // <= Does not compile!
di.GetFiles("*.dat").Select(deleter); // <= Does not compile!

为了从目录中删除旧文件。但是我不知道如何在没有明确 foreach 的情况下直接将委托应用于 FilInfo[] (上面列出的想法当然行不通)。

是否可以?

4

3 回答 3

7

Select()用于将项目从投影TSourceTResult。在您的情况下,您不需要,Select因为您没有投影。相反,使用List<T>sForEach方法删除文件:

di.GetFiles("*.pdf").ToList().ForEach(deleter);
于 2012-06-07T15:18:21.393 回答
0

正如 DarkGray 建议的那样,如果有点不寻常,您可以使用Select来首先操作文件,然后返回一个空集合。我建议使用ForEach扩展程序,如下所示:

ForEachLINQ 扩展

public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<T> action)
{
    foreach(TSource item in source)
     {
        action(item);
    }
}

然后您应该能够对 的数组执行操作FileInfo,因为数组是一个枚举器。像这样:

执行

Action<FileInfo> deleter = f =>
{
    if (....) // delete condition here
    {
        System.IO.File.Delete(f.FullName);
    }
};

DirectoryInfo di = new DirectoryInfo(_path);
di.GetFiles("*.pdf").ForEach(deleter);

理查德编辑。
我确实想提请注意foreachvs的论点ForEach。在我看来,该ForEach语句应该直接影响传入的对象,在这种情况下确实如此。所以我自相矛盾。哎呀!:)

于 2012-06-07T15:19:13.467 回答
-1
di.GetFiles("*.pdf").Select(_=>{deleter(_);return null;}); 

或者

di.GetFiles("*.pdf").ForEach(action); 

public static class Hlp
{
 static public void ForEach<T>(this IEnumerable<T> items, Action<T> action)
 {
   foreach (var item in items)
     action(item);
 }
}
于 2012-06-07T15:10:49.287 回答