Получите доступ к элементу массива класса, используя переменную-член вместо индекса в C # - PullRequest
4 голосов
/ 13 марта 2012

предположим, у меня есть класс, подобный

class ABC
{
    int ID;
    public string Name;
    public ABC(int i, string str) { ID = i; Name = str; }
}

И объявляем массив класса ABC. Предположим, что я также инициализировал каждый элемент, используя новое ключевое слово. Теперь я хочу получить доступ к элементу класса, используя его идентификатор члена вместо 0 на основе индекса. При необходимости сделайте общедоступным удостоверение личности.

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        ABC[] a = new ABC[3];
        a[0] = new ABC(100, "First");
        a[1] = new ABC(101, "Second");
        a[2] = new ABC(102, "Third");

        ABC newobj = a[100]; // where 100 is ID of class ABC
    }
}

class ABC
{
    int ID;
    string Name;
    public ABC(int i, string str)
    {
         ID = i;
         Name = str;
    }
}

Ответы [ 4 ]

2 голосов
/ 13 марта 2012

Вы можете использовать LINQ, чтобы получить нужный объект:

ABC newobj = a.Where(abc => abc.ID == 100).FirstOrDefault();

, который возвращает null, если нет соответствующего идентификатора.

Как подсказал @Xanatos, вы также можете использовать эту более аккуратную версию:

ABC newobj = a.FirstOrDefault(abc => abc.ID == 100);

Как предположил @Jon, может быть лучше использовать Dictionary<int, ABC> для хранения ваших экземпляров ABC. Он обеспечивает лучшую производительность, чем всегда итерация Collection для поиска подходящего идентификатора. Но тогда ключ должен быть уникальным, вы не можете добавить два ABC экземпляра с одинаковым идентификатором:

var a = new Dictionary<int, ABC>();
a.Add(100, new ABC(100, "First"));
a.Add(101, new ABC(101, "Second"));
a.Add(102, new ABC(102, "Third"));

Вы бы получили к нему доступ таким образом:

ABC newobj = a[100];
1 голос
/ 13 марта 2012

Вот код для работы со словарем (MSDN) :

//instantiate it: key is of type int, value is of type string
var dict = new Dictionary<int, string>();
//add a few items...
dict.Add(100, "First");
dict.Add(101, "Second");

//get item with key '100'
var first = dict[100];

Надеюсь, это поможет!

0 голосов
/ 13 марта 2012

Вы можете просто использовать запрос LINQ для решения проблемы:

 var newobj = (from data in a
               where data.ID ==100
               select data).Cast<ABC>();
0 голосов
/ 13 марта 2012

Перегрузка индексатора для стандартного массива невозможна в C #. Если вам нужно пойти по пути индексатора, я бы предложил использовать Dictionary или класс List, который предоставляет собственный индексатор.

class ABCCollection : List<ABC>
{
  public ABC this[int id]
  {
    get { return this.Where(abc => abc.ID == id).FirstOrDefault(); }
  }
}

Затем вы звоните, используя ABCCollection [100] для доступа к вашему элементу.

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