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()からアイテムを投影するために使用されTSourceますTResult。あなたの場合、あなたはSelect投影していないのであなたは必要ありません。代わりに、List<T>sForEachメソッドを使用してファイルを削除します。

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

DarkGray が示唆するように、多少珍しいことですが、Select最初にファイルのアクションを使用してから、null コレクションを返すことができます。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);

リチャードによる編集。vs
の引数に注意を向けたいと思います。私の意見では、ステートメントは渡されるオブジェクトに直接影響を与えるべきであり、この場合はそうです。だから私は自分自身に矛盾しました。おっとっと!:)foreachForEachForEach

于 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 に答える