如果我有一个对象列表,例如List<Cake>
,可以在Cake对象中有一个private int key
,每次添加到列表时都会存储一个自动递增的值。
我之所以想要这样,是因为我可以在我的列表中填充一个包含所有“Cakes”的组合框,并为每个我不需要输入的元素提供唯一值。
例如:
public class Cake
{
private int _id;
private string _name;
public Cake(string name)
{
_name = name;
}
public int GetID()
{
return _id;
}
}
List<Cake> myCakeList = new List<Cake>();
myCakeList.Add(new Cake("Sponge"));
myCakeList.Add(new Cake("Chocolate"));
myCakeList.Add(new Cake("Battenburg"));
myCakeList.ForEach(x => {Console.WriteLine(x.GetID());});
理想情况下,此代码将返回:
0000001
0000002
0000003
或(如果我想要一个随机ID)
389hguhg907903
357fboib4969gj
fhgw90290682gg
请问您是否可以(对于两种关键类型)以及如何做到这一点。此外,这是否是解决我问题的可怕方法。
非常感谢,
阿什利
答案 0 :(得分:3)
每次创建Cake的实例时,_id都会自动增加
public class Cake
{
private int _id;
private string _name;
private static LastID;
public Cake(string name)
{
_name = name;
_id = LastID++;
}
public int GetID()
{
return _id;
}
}
答案 1 :(得分:2)
列表中的项目可通过索引访问。为什么不直接使用列表中的索引?
List<Cake> myCakeList = new List<Cake>();
myCakeList.Add(new Cake("Sponge"));
myCakeList.Add(new Cake("Chocolate"));
myCakeList.Add(new Cake("Battenburg"));
foreach (var i in Enumerable.Range(0, myCakeList.Length)) {Console.WriteLine(i);}
答案 2 :(得分:0)
我一般认为这种编码风格是个坏主意。添加到列表中的此ID生成是副作用,并不总是预期(或甚至已知发生)。副作用有时是必要的(实际上很多编程都依赖于它们),但它们也很棘手。例如,如果同一个Cake对象被添加到两个列表中会怎样?然后怎样呢?这样的惊喜会导致代码难以调试。
Slantroph的想法是在创建时给所有Cake对象一个独特的想法并不坏,这是一种非常常见的模式。但你真的需要它吗?您仍然可以使用object.ReferenceEquals()
之类的对象分辨对象。也许您真正需要的是Equals
和GetHashcode
覆盖?
答案 3 :(得分:0)
听起来你正试图获得类似于RDBMS表中的自动递增ID的东西。
在RDBMS中需要它们的原因是允许一个表中的记录通过存储另一个记录的ID来识别另一个表中的记录。
在处理内存中的对象时,在C#中不需要这样做。你只需要在一个对象上有一个字段,该对象包含对另一个对象的引用。
RDBMS表和List<T>
之间的另一个重要区别是给定记录与单个表相关联。这不是C#中对象的工作方式。它们都只是浮在“某处”的记忆中。 List<T>
仅仅是一个包含对其他对象的引用的对象。因此,其他列表(以及其他类型的对象)可以保持对同一对象的引用。在语言层面,没有人是另一个人的“拥有者”。