Member 12625485 Ответов: 4

Как присвоить целочисленный идентификатор для каждого предварительная класса в C#?


допустим, у меня есть несколько экземпляров этого класса

открытый класс АБ
{
}

в main я создаю экземпляры класса AB

AB a = новый AB();
AB b = новый AB();
AB c = новый AB();
......


я хочу сопоставить каждый экземпляр класса с целочисленным идентификатором. Как я могу это сделать в c#?

Что я уже пробовал:

Я попробовал перечисления. и словарь. Проблема со словарем заключается в том, что если я изменяю порядок экземпляров, то меняется даже идентификатор. Я хочу что-то вроде
если ID равен 0, то следует использовать a
если ID равен 1, то следует использовать b
если ID равен 2, то следует использовать c и так далее

но я не хочу использовать if / else и переключаться

4 Ответов

Рейтинг:
2

Michael_Davies

Почему бы не использовать массив вашего класса, тогда ID - это индекс класса, к которому вы хотите получить доступ?

Следующее дает 4 класса.

AB[] a = новый AB[4];

Затем a [ID] получает доступ к нужному вам классу.


Рейтинг:
2

OriginalGriff

Вы могли бы использовать массив:

private AB[] AllInstances = new AB[3];
...
    AB a = new AB();
    AllInstances[0] = a;
    AB b = new AB();
    AllInstances[1] = b;
    AB c = new AB();
    AllInstances[2] = c;
Затем вы просто получаете доступ к массиву по идентификатору в качестве индекса:
AB it = AllInstances[ID];

Кроме того, вы можете добавить значение ID в свой класс AB в качестве свойства и добавить статическую коллекцию:
private static List<AB> AllInstances = new List<AB>
Затем в конструкторе AB добавьте его в коллекцию:
public AB(int id)
   {
   ID = id;
   AllInstances.Add(this);
   }
Все, что вам нужно, это использовать Linq для получения экземпляра:
public AB Get(int id)
   {
   return AllInstances.Where(ab => ab.ID == id).FirstOrDefault();
   }


Рейтинг:
1

BillWoodruff

"The problem with dictionary is that if i change the order of the instances, then even the ID changes."
Это утверждение не имеет смысла. Хотя это правильно, что вы должны никогда не полагайтесь на KeyValuePairs в словаре, находящихся в том же" порядке", в котором вы их помещаете (или в любом другом порядке), использование словаря гарантирует ... в силу того, что он не допускает дубликатов ключей ... что каждый ключ уникален.

Я думаю (думаю), что вам нужен уникальный идентификатор (int) для каждого экземпляра класса; один из способов сделать это -:
using System.Collections.Generic;

namespace YourNameSpace
{
    public class AB
    {
        private static int AB_ID = 0;

        public static Dictionary<AB, int> ABInstanceToID = new Dictionary<AB, int>();

        public int ID { set; get; }

        public AB()
        {
            this.ID = AB_ID;
            ABInstanceToID.Add(this, this.ID);
            AB_ID++;
        }
    }
}
Таким образом, учитывая экземпляр AB во время выполнения, вы можете прочитать его идентификатор, выполнив поиск в статическом словаре:
if(AB.ABInstanceToID.ContainsKey(someAB))
{
       int index = AB.ABInstanceToID[someAB];

       switch(index)
       {
           case 0:
              // handle case O
              break;

           default:
              break;
       }
}
else
{
     // throw an error ?
     // put up a warning with a MessageBox ?>
}
Примечание:

1.in "теория" тест "ContainsKey" не должен быть необходим, но я думаю, что это всегда хорошая идея, чтобы проверить и перепроверить, и планировать ошибки.

2. в то время как некоторые могут предпочесть использование словаря.TryGetValue для проверки, в данном случае, когда мы можем предположить, что частые попытки поиска отсутствующих ключей очень маловероятны, я не вижу причин использовать это здесь.


Рейтинг:
1

Karthik_Mahalingam

попробовать это

AB a = new AB();
AB b = new AB();
AB c = new AB();
AB d = new AB();
AB e = new AB();

AB[] array = new AB[5];
array[0] = a;
array[1] = b;
array[2] = c;
array[3] = d;
array[4] = e;

int id = 2;
var instance = array[id];  // gets instance for c