使用变量值检查特定实例是否存在,如果不存在 - 创建它
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();
}
}
关于如何完成这个的建议?
您似乎在尝试创建单个变量 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();
}
}
您需要创建 "registry" 个已知的 Pic
。 DIctionary<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
作为序言
我有这样一张图片列表:
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();
}
}
关于如何完成这个的建议?
您似乎在尝试创建单个变量 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();
}
}
您需要创建 "registry" 个已知的 Pic
。 DIctionary<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
作为序言