0

特定の条件に一致するディレクトリからすべてのファイルを削除したいが、リスト(またはIEnumerable)からアイテムを削除したい(後でそのリストを操作したいので、そのリストにアイテムが必要ないため)ファイルシステムにはもう存在しません!)

簡単な方法は、特定の条件に一致するすべてのアイテムをリストに集めてから、一時リストをループして、ファイルとリストアイテムの両方を元のリストから削除することです。ただし、最初にフィルター処理された一時リストを作成せずに、両方のタスクを1つのステップで実行するソリューションを見ていただければ幸いです。

// non-sense code example
lstFiles.ForEach(x => x.CreationTime < __now.AddDays(maxAge * -1), x => x.Delete())
    .Remove(x);
// or...
newList/IEnumerable = lstFiles.Where(x => x.CreationTime < __now.AddDays(maxAge * -1), x.Delete()).RemoveAll(x)

別の質問: 条件に一致する(一致しない)すべてのアイテムが追加され、他のすべてのアイテムが削除されるファイルのリストを作成できますか?アディショナルのようなもの.WhereNot(x => x.Delete())

また...

IEnumerable<FileInfo> cleanedList =
    (from files in directory.EnumerateFiles()
     where files.CreationTime < __now.AddDays(maxAge * -1)
     wherenot files.Delete()
     select files)
4

3 に答える 3

3

メソッドにブール値を返すようにDelete()すると、次を使用できます。

lstFiles.RemoveAll(x => x.CreationTime < _now.AddDays(maxAge * -1) && x.Delete());

&&ステートメントの最初の部分が失敗した場合、2番目の部分は評価されないため、条件に一致するファイルでのみ削除が行われます。

これには、削除が失敗したときにリストからファイルが削除されないという追加の利点があります。

于 2013-02-28T18:24:06.653 に答える
0

チェーン操作を維持しながら複数の操作を実行する場合は、MicrosoftのInteractive Extensions(IX)と.Doおよび.ForEach拡張機能を使用できます。

lstFiles
   .Where(x => x.CreationTime < __now.AddDays(maxAge * -1))
   .Do(x => x.DoThing1())
   .Do(x => x.DoThing2())
   .ForEach(x => x.Remove());
于 2013-02-28T16:57:28.587 に答える
0

List別のアプローチを使用できます。を使用する代わりにObservableCollection、イベントにハンドラーをアタッチしCollectionChanged、アイテムが削除されるたびに、関連付けられたファイルを削除します。

collection.CollectionChanged += ContentCollectionChanged;
[...]
public void ContentCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.Action == NotifyCollectionChangedAction.Remove)
    {
        foreach(var file in e.OldItems)
        {
            //Removed file
        }
    }
}

このように、コレクションから削除する要素のみを処理する必要があります。

于 2013-02-28T17:09:48.087 に答える