使用LINQ with Action删除旧文件

时间:2012-06-07 15:08:19

标签: c# linq

我想做点什么

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!

以便从目录中删除旧文件。但我不知道如何直接将委托应用于FilInfo []而没有明确的foreach(上面列出的想法当然不起作用)。

有可能吗?

3 个答案:

答案 0 :(得分:5)

Select()用于项目项目从TSourceTResult。在您的情况下,您不需要Select,因为您没有预测。而是使用List<T> s ForEach方法删除文件:

di.GetFiles("*.pdf").ToList().ForEach(deleter);

答案 1 :(得分:0)

正如DarkGray建议你可以,如果有些不寻常,可以利用Select首先操作文件,然后返回一个空集合。我建议你使用ForEach扩展,如:

ForEach LINQ扩展

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

Richard编辑。
我想提请注意foreach vs ForEach的论点。在我看来,ForEach语句应该直接影响传入的对象,在这种情况下它会。所以我自相矛盾。哎呀! :)

答案 2 :(得分:-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);
 }
}