gpt4 book ai didi

c# - 抽象一个 List,其源可以通过 C# 中的接口(interface)递归?

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:21 25 4
gpt4 key购买 nike

我正在创建一个小实用程序,它可以从任何我想要的地方(网络、文件系统、ftp 等)抓取图像并对其进行一些处理。对于通过要处理的文件列表工作的主循环,我希望抽象图像对象的源,以便主要处理例程不关心它来自哪里。比如我的

我想做一个界面,大致是这样

  interface IBitmapStreamProvider {

List<Bitmap> FileQueue;
bool SaveOutput(Bitmap filetosave);

}

然后我就可以保持简单了

foreach(Bitmap bmp in fileSystemBMP.FileQueue)
{
BitmapProcessor.DoStuff(bmp);
fileSystemBMP.SaveOutput(bmp);
}

这样我就有了一个可以提供列表的类,保存是抽象的,源也是如此。

如果我只是从一个位置创建一个简单的列表,这会很简单,比如一个没有子目录的目录。但是,如果它是一个递归位置,我该如何设计或调用它呢?我希望代码一次打开一个位图,并不断更新工作列表,直到用完为止。此外,如果它是网络拉取或 ftp 拉取,该文件将按需一次拉取一个。但我希望迭代成为这样做的触发器。

我不希望实现担心源代码,只需执行它的工作并在 List 对象上循环即可。同样,一次打开所有内容也不是一种选择,预先填充文件列表也不好,因为理论上它可能是一个巨大的列表。它基本上需要一次发生一个文件。有什么建议如何做到这一点?

最佳答案

您可以使用 yield return 实现位图延迟加载.这样做FileQueue应该是 IEnumerable<Bitmap> 类型.对于递归列表,使用 LINQ 或递归来创建扁平化的文件(或路径)列表...

interface IBitmapStreamProvider 
{
IEnumerable<Bitmap> FileQueue;
bool SaveOutput(Bitmap filetosave);
}

public class BitmapStreamProvider : IBitmapStreamProvider
{
public IEnumerable<Bitmap> FileQueue
{
get
{
return GetNextFile();
}
}

private IEnumerable<Bitmap> GetNextFile ()
{
IEnumerable<string> fileLocations = // load list of file uri's or paths here, recursively if needed
foreach (var location in fileLocations)
{
var bitmap = // fetch bitmap
yield return bitmap;
}
}

public bool SaveOutput(Bitmap filetosave)
{
// ...
}
}

关于c# - 抽象一个 List<T>,其源可以通过 C# 中的接口(interface)递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com