0

我想从与特定条件匹配的目录中删除每个文件,但我也希望从我的列表(或 IEnumerable)中删除这些项目(因为我想稍后使用该列表并且不希望其中有任何项目文件系统上不再存在!)

一种简单的方法是将与特定条件匹配的每个项目收集到一个列表中,然后遍历临时列表并从原始列表中删除文件和列表项。但我很高兴看到一个解决方案,其中两个任务都在一个步骤中完成,而无需先创建过滤的临时列表。

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

如果 && 语句的第一部分失败,则不会评估第二部分,因此删除只会发生在符合条件的文件上。

这还有一个额外的好处,即当删除失败时,它不会从您的列表中删除该文件。

于 2013-02-28T18:24:06.653 回答
0

您可以使用不同的方法:您可以使用 ,而不是使用ListObservableCollection将处理程序附加到事件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 回答
0

如果您想在保持链接操作的同时执行多个操作,您可以使用 Microsoft 的交互式扩展 (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 回答