дизайн индексатора класса для доступа ко всему массиву в классе - PullRequest
0 голосов
/ 09 сентября 2018

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

Текущий подход, который я использую, заключается в хранении в DataTable, доступе через номера строк и внесении изменений.

Есть ли способ, где я мог бы создать класс, содержащий все эти свойства и доступ через индексаторы?

что-то вроде ниже

class Person
{
  public int[] id{get;set;}
  public string[] Name{get; set;}
  //your suggestion for indexer is required here
  public <some type> this[int index]
  {
   //get/set logic to retrieve/modify a users input ->so that the following is achieved
   //some thing like Person P=new Person(); now I should be able to do modifications like P[0].Name="New Name" or should retrieve data like P[0].Name,P[0].Id could be done
  }    
}

Примечание. Все массивы будут иметь одинаковую длину.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Вы можете использовать другой класс, имеющий список Person и индексатор, которые возвращают экземпляр person.

public class Program
{
    public static void Main()
    {
      Persons pp=new Persons();
      Person p=new Person() { id=1, Name="test"};
      Person p1=new Person() { id=2, Name="test1"};
      pp.PersonsList.Add(p);
      pp.PersonsList.Add(p1);

      pp[1]=new Person(){id=3,Name="tye"};
      Console.WriteLine(pp[1].Name);
   }
 }


 class Person
 {

  public int id {get;set;}
  public string   Name {get; set;}

 }

 class Persons
 {
   public Persons()
   {
       PersonsList=new List<Person>();
   }
   public List<Person> PersonsList {get;set;}
   public Person this[int index]
   {
     get {  return PersonsList[index];  }
     set { 
         PersonsList[index].id=value.id;
         PersonsList[index].Name=value.Name;
         }
   }
 }

Рабочий код здесь ... Кодовая ссылка

0 голосов
/ 09 сентября 2018

Вы можете вернуть промежуточный тип. Однако я не рекомендую делать это. Ваш подход "параллельного массива" часто указывает на отсутствующий тип и рассматривается как запах кода. Я рекомендую вам создать класс (или, может быть, строгий, в зависимости от вашего варианта использования) с Id и свойством name. И хранить экземпляры этого класса в массиве или другом типе коллекции.

Если вы используете промежуточный подход, вы можете сделать что-то вроде этого

struct PersonEntry
{
    private readonly Person _person;
    private readonly int _index;

    public PersonEntry(Person person, int index)
    {
        _person = person;
        _index = index;
    }

    public int Id
    {
        get => _person.id[ _index];
        set => _person.id[ _index] = value;
    }

    public int Name
    {
        get => _person.Name[ _index];
        set => _person.Name[ _index] = value;
    }
}

PersonEntry this[int index]
{
    get => new PersonEntry(this, index);
}

При таком подходе вы можете изменить имя и идентификатор.

Моя рекомендация:

class Person
{
    public int Id {get; set;}
    public string Name {get; set;}
}

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