使用变量值检查特定实例是否存在,如果不存在 - 创建它

Use variable value to check if particular instance exists, if not - create it

我有这样一张图片列表:

public List<Image> imageList = new List<Image>();

我也有一张图片 class 以便收集和处理有关列表中图片的数据:

public Class Pic {
    // properties and stuff
}

然后我有一个以整数作为参数的函数。该整数对应于图像列表中的图像。我想在该函数中做的是检查是否已为该特定图像创建了 Pic class 的实例。如果没有,我想创建它,使用传递给函数的变量值。下面的代码显然行不通,但它显示了我想要的:

public void doStuffWithImage(int picNumber) {
    // Check if instance called pic + picNumber exists
    if(pic + picNumber.toString() == null) {
        // Create an instance
        Pic pic + picNumber.toString() = new Pic();
    }
}

关于如何完成这个的建议?

您似乎在尝试创建单个变量 pic1pic2 等。您最好使用字典:

Dictionary<int, Pic> pics = new Dictionary<int, Pic>();

public void doStuffWithImage(int picNumber) {
    // Check if instance called pic + picNumber exists
    if(!pics.ContainsKey(picNumber)) {
        // Create an instance
        pics[picNumber] = new Pic();
    }
}

您需要创建 "registry" 个已知的 PicDIctionary<int,Pic> 最好 collection 保留此注册表。您需要将注册表本身存储在某个地方 - 也许在注册您的图片的 "factory" object 中。

class PicFactory {
    private readonly IDictionary<int,Pic> knownPics = new Dictionary<int,Pic>();
    public Pic GetOrCreate(int id) {
        Pic res;
        if (knownPics.TryGetValue(id, out res)) {
            return res;
        }
        res = new Pic(id.ToString()); // This assumes that Pic(string) exists
        knownPics.Add(id, res);
        return res;
    }
}

这种实现注册表的方式对于您的目的来说可能过于原始 - 例如,如果您需要您的注册表是并发的,您将需要设置某种锁定方案来保护 knownPics 词典。访问图片的 class 需要创建一个 PicFactory 的实例,以便它可以通过 GetOrCreate(id) 调用访问图片。

如果您使用 .net 4.0 或更多,您可以使用 Lazy 输入:

Provides support for lazy initialization.

这意味着对象不是在声明的时候构造的,而是在第一次访问的时候构造的。

所以你基本上可以像

那样声明它们
List<Lazy<Pic>> ....

请参阅 Lazy<T> 和一般的延迟加载模式 - 这实际上是一种常见的优化技术,因为它将启动时可能增加的内容推迟到运行时的微延迟。

小心确保微延迟是值得的,我建议留下关于哪些方法可以强制加载。

如果您是从 列表 中抓取,请改为使用 .Any or .Contains check, and since you're looking up by name like that, consider using a Dictionary 作为序言