C# несколько индексаторов

Если вы не хотите изменять значения, а также хотите получить доступ к членам коллекции, не требуя случайного доступа, очень простое решение вместо постоянного массива имеет окончательный неизменный список:

static final ImmutableList<Type> arrayOfConstants = ImmutableList.of(t1, t2, t3);
14
задан smack0007 10 January 2009 в 17:06
поделиться

6 ответов

Не в C#, нет.

Однако можно всегда возвращать наборы из свойств, следующим образом:

public IList<Foo> Foos
{
    get { return ...; }
}

public IList<Bar> Bars
{
    get { return ...; }
}

IList< T> имеет индексатор, таким образом, можно записать следующее:

C whatever = new C();
Foo myFoo = whatever.Foos[13];

На строках "возвращаются..."; можно возвратить любые реализации IList< T> но Вы могли бы, что возвратить обертку только для чтения вокруг Вашего набора, посмотрите AsReadOnly () метод.

17
ответ дан 1 December 2019 в 06:35
поделиться

СУЩЕСТВУЕТ путь.. если Вы определяете 2 новых типа к внизу компилятору для различения двух различных подписей...

  public struct EmployeeId
  { 
      public int val;
      public EmployeeId(int employeeId) { val = employeeId; }
  }
  public struct HRId
  { 
      public int val;
      public HRId(int hrId) { val = hrId; }
  }
  public class Employee 
  {
      public int EmployeeId;
      public int HrId;
      // other stuff
  }
  public class Employees: Collection<Employee>
  {
      public Employee this[EmployeeId employeeId]
      {
          get
             {
                foreach (Employee emp in this)
                   if (emp.EmployeeId == employeeId.val)
                      return emp;
                return null;
             }
      }
      public Employee this[HRId hrId]
      {
          get
             {
                foreach (Employee emp in this)
                   if (emp.HRId == hrId.val)
                      return emp;
                return null;
             }
      }
      // (or using new C#6+ "expression-body" syntax)
      public Employee this[EmployeeId empId] => 
             this.FirstorDefault(e=>e.EmployeeId == empId .val;
      public Employee this[HRId hrId] => 
             this.FirstorDefault(e=>e.EmployeeId == hrId.val;

  }

Затем для вызова его необходимо было бы записать:

Employee Bob = MyEmployeeCollection[new EmployeeID(34)];

И если Вы записали неявный оператор преобразования:

public static implicit operator EmployeeID(int x)
{ return new EmployeeID(x); }

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

Employee Bob = MyEmployeeCollection[34];

То же самое применяется, даже если эти два индексатора возвращают различные типы...

5
ответ дан 1 December 2019 в 06:35
поделиться

При попытке сделать что-то вроде этого:

var myClass = new MyClass();

Console.WriteLine(myClass.Foos[0]);
Console.WriteLine(myClass.Bars[0]);

затем необходимо определить индексаторы на самих классах Foo и Bar - т.е. поместить все объекты Foo в Foos и сделать Foos экземпляром типа, который поддерживает индексацию непосредственно.

Для демонстрации использования выстраивает для свойств элемента (так как они уже поддерживают индексаторы):

public class C {
    private string[] foos = new string[] { "foo1", "foo2", "foo3" };
    private string[] bars = new string[] { "bar1", "bar2", "bar3" };
    public string[] Foos { get { return foos; } }
    public string[] Bars { get { return bars; } }
}

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

 C myThing = new C();
 Console.WriteLine(myThing.Foos[1]);
 Console.WriteLine(myThing.Bars[2]);
3
ответ дан 1 December 2019 в 06:35
поделиться

C# не имеет перегрузки типа возврата. Можно определить несколько индексаторов, если их входные параметры отличаются.

0
ответ дан 1 December 2019 в 06:35
поделиться

Нет Вы наклоняетесь, делают это. Только методы, которые могут иметь их подписи, отличаются только типом возврата, операторы преобразования. Индексаторы должны иметь различные входные типы параметра, чтобы заставить это компилировать.

0
ответ дан 1 December 2019 в 06:35
поделиться

Это из спецификации C # 3.0

«Перегрузка индексаторов позволяет классу, структуре или интерфейсу объявлять несколько индексаторов при условии, что их подписи уникальны в пределах этого класса, структуры или интерфейса».

public class MultiIndexer : List<string>  
{
    public string this[int i]
    {
        get{
            return this[i];
        }
    }
    public string this[string pValue]
    {
        get
        {
            //Just to demonstrate
            return this.Find(x => x == pValue);  
        }
    }      
}
16
ответ дан 1 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: