Автоинкрементный идентификатор контейнера C # - PullRequest
1 голос
/ 29 августа 2010

Если у меня есть список объектов, например, List<Cake>, возможно ли иметь в объекте Cake значение private int key, которое будет хранить автоматически увеличивающееся значение каждый раз, когда я добавляю в список.

Моя причина для этого заключается в том, чтобы я мог заполнить комбинированный список, содержащий все «Торты» в моем списке, уникальным значением для каждого элемента, который мне не нужно вводить самому.

Например:

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

или (если бы я хотел случайный идентификатор)

389hguhg907903
357fboib4969gj
fhgw90290682gg

Не могли бы вы сообщить, если это навсе возможно (для обоих типов ключей) и как это можно сделать.Кроме того, является ли это ужасным решением моей проблемы.

Заранее большое спасибо,

Эшли

Ответы [ 4 ]

3 голосов
/ 29 августа 2010

здесь _id автоматически увеличивается каждый раз, когда вы создаете экземпляр Cake

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;
    }
}
2 голосов
/ 29 августа 2010

Элементы в списке доступны по индексу. Почему бы просто не использовать индекс уже в вашем списке?

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);}
0 голосов
/ 29 августа 2010

Звучит так, будто вы пытаетесь получить что-то похожее на самоинкрементный идентификатор, найденный в таблицах РСУБД.

Причина, по которой они необходимы в СУБД, заключается в том, чтобы позволить записи в одной таблице идентифицироватьзапись в другой таблице путем сохранения идентификатора другой записи.

Это не требуется в C # при работе с объектами в памяти.У вас просто есть поле в одном объекте, которое содержит ссылку на другой объект.

Другое важное различие между таблицами РСУБД и List<T> состоит в том, что данная запись связана с одной таблицей.Это не так, как объекты работают в C #.Все они просто плавают «где-то» в памяти.List<T> - это просто объект, который содержит ссылки на другие объекты.Таким образом, другие списки (и вообще другие типы объектов) могут содержать ссылки на тот же объект.Никто не является «владельцем» другого на уровне языка.

0 голосов
/ 29 августа 2010

Я вообще считаю этот стиль кодирования плохой идеей. Эта генерация идентификатора при добавлении в список является побочным эффектом, и не всегда ожидается (или даже известно, что это происходит). Иногда необходимы побочные эффекты (на самом деле от них зависит большое количество программ), но они также могут быть сложными. Например, что если один и тот же объект Cake будет добавлен в два списка? Что тогда? Такие сюрпризы могут привести к тому, что код будет трудно отлаживать.

Идея Слантрофа о том, чтобы просто дать всем объектам Cake уникальную идею при создании, неплоха и является довольно распространенной моделью. Но тебе это действительно нужно? Вы все еще можете различать объекты с помощью object.ReferenceEquals(). Возможно, что вам действительно нужно, это хорошо продуманные Equals и GetHashcode переопределения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...