自动递增C#容器ID

时间:2010-08-28 20:46:16

标签: c# containers auto-increment

如果我有一个对象列表,例如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

请问您是否可以(对于两种关键类型)以及如何做到这一点。此外,这是否是解决我问题的可怕方法。

非常感谢,

阿什利

4 个答案:

答案 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()之类的对象分辨对象。也许您真正需要的是EqualsGetHashcode覆盖?

答案 3 :(得分:0)

听起来你正试图获得类似于RDBMS表中的自动递增ID的东西。

在RDBMS中需要它们的原因是允许一个表中的记录通过存储另一个记录的ID来识别另一个表中的记录。

在处理内存中的对象时,在C#中不需要这样做。你只需要在一个对象上有一个字段,该对象包含对另一个对象的引用。

RDBMS表和List<T>之间的另一个重要区别是给定记录与单个表相关联。这不是C#中对象的工作方式。它们都只是浮在“某处”的记忆中。 List<T>仅仅是一个包含对其他对象的引用的对象。因此,其他列表(以及其他类型的对象)可以保持对同一对象的引用。在语言层面,没有人是另一个人的“拥有者”。