我有一个像这样的图像列表:
public List<Image> imageList = new List<Image>();
我还有一个图片类,以便收集和操作列表中图像的数据:
public Class Pic {
// properties and stuff
}
然后我有一个以整数作为参数的函数。该整数对应于图像列表中的图像。我想在函数中做的是检查是否为该特定图像创建了Pic类的实例。如果没有,我想创建它,使用传递给函数的变量的值。以下代码显然不起作用,但它显示了我想要的内容:
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();
}
}
关于如何实现这一目标的建议?
答案 0 :(得分:1)
您似乎正在尝试创建单个变量pic1
,pic2
等等。您最好使用字典:
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();
}
}
答案 1 :(得分:0)
您需要创建一个&#34;注册表&#34;已知Pic
的。 DIctionary<int,Pic>
是保存此注册表的好集合。你需要将注册表本身存储在某个地方 - 也许是在&#34;工厂&#34;注册图片的对象。
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
字典。访问图片的类需要创建PicFactory
的实例,以便它可以通过GetOrCreate(id)
调用访问图片。
答案 2 :(得分:0)
如果您使用.net 4.0
或更多,则可以使用Lazy类型:
为延迟初始化提供支持。
这意味着对象将不是在声明的时刻构建,而是在第一次访问时构建。
所以你基本上可以声明它们像
List<Lazy<Pic>> ....
答案 3 :(得分:0)
请参阅Lazy<T>
和一般的延迟加载模式 - 这实际上是一种常见的优化技术,因为它推迟了在启动时可以添加到运行时的微延迟的内容。
要小心确保微延迟是值得的,我建议留下哪些方法可以强行加载。
如果您从列表中抓取,请使用.Any
或.Contains
检查前言,并且由于您正在按名称查找,请考虑使用而是Dictionary