类索引器设计,以访问类中的所有数组

时间:2018-09-09 16:17:20

标签: c# oop c#-6.0

我有一个需要存储值列表的场景,例如:id,姓名,部门,手机号码等

我目前使用的方法是存储在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 :(得分:1)

您可以使用另一个具有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;
         }
   }
 }

此处的工作代码... Code link

答案 1 :(得分:-1)

您可以返回中间类型。但是,我不建议您这样做。您的“并行数组”方法通常指示缺少类型,并被视为代码异味。我建议您创建一个具有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);
}

使用这种方法,您可以更改名称和ID。

我推荐的解决方案是:

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

Person[] persons;