Инициализируйте элементы с помощью скобок, таких как Списки в c # - PullRequest
0 голосов
/ 13 сентября 2018

Я думал о массивах и списках и задавался вопросом, могут ли и как классы заставить реализацию быть инициализируемой, как они.Давайте возьмем этот класс за основу:

class TestClass
{
    private List<int> Numbers = new List<int> ();

    // Insert code here
}

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

TestClass test = new TestClass () { 2, 4, 7, 10 };

Что было бы нормальновозможно следующее:

List<int> test = new List<int> () { 2, 4, 7, 10 };

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

TestClass test = { 2, 4, 7, 10 };

Я полагаю, что это менее вероятно.Обратите внимание, что они отличаются от этого:

Cat cat = new Cat() { Name = "Sylvester", Age=8 };

Это прямые и необязательные объявления внутренних полей и свойств.

См. Также MSDN для получения дополнительной информации .

Ответы [ 4 ]

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

Чтобы ответить на ваш второй вопрос: если это возможно сделать

TestClass test = { 2, 4, 5, 7 };

Я не думаю, что это правильный синтаксис в любом месте. Однако вы можете создать нечто, похожее на это, используя неявный оператор.

Поскольку вы можете создать экземпляр int array следующим образом: new[] {1,2,3,4}, вы можете создать следующее в вашем TestClass.

public class TestClass {
   private IEnumerable<int> list;
   public TestClass(IEnumerable<int> _list) {
       this.list = _list;
   }

   public static implicit operator(int[] input) {
        return new TestClass(input.ToList());      
   }
}

Затем создайте новый TestClass, как этот; TestClass testClass = new[] {1,2,3};

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

Как указано здесь , инициализаторы коллекции будут работать с любым классом, который реализует IEnumerable , а имеет метод Add().

class TestClass : IEnumerable<int>
{
    private List<int> Numbers = new List<int> ();

    public void Add(int n)
    {
        Numbers.Add(n);
    }

    // implement IEnumerable methods down here ...

    public IEnumerator<int> GetEnumerator() => Numbers.GetEnumerator();

    // etc ...
}

Обратите внимание, чтоесли у вас есть более одного параметра в сигнатуре Add() метода, вы можете заключить их в фигурные скобки, чтобы использовать синтаксис инициализатора коллекции.

class TestClass2 : IEnumerable<(int, int)>
{
    private List<int> Numbers = new List<(int, int)> ();

    public void Add(int x, int y)
    {
        Numbers.Add((x, y));
    }

    // implement IEnumerable methods down here ...

    public IEnumerator<(int, int)> GetEnumerator() => Numbers.GetEnumerator();

    // etc ...
}

будет использоваться следующим образом:

var test = new TestClass2 { {2, 3}, {4, 5} };
0 голосов
/ 13 сентября 2018

Технически, минимум требования

  1. IEnumerable интерфейс (конечно, IEnumerable<T> - лучший выбор)
  2. Add метод

Минимальный пример (только демонстрация):

  class TestClass: System.Collections.IEnumerable {
    public void Add(int value) { }

    public IEnumerator GetEnumerator() {
      // Just to demonstrate, do not do this in production code
      return null;
    }
  }

  ...

  TestClass myTest = new TestClass() {1, 2, 3};  

В вашем случае:

  class TestClass: IEnumerable<int> {
    private List<int> Numbers = new List<int>();

    // This is required
    public void Add(int value) {
      Numbers.Add(value);
    }

    public IEnumerator<int> GetEnumerator() {
      return Numbers.GetEnumerator();
    }

    // This is required
    IEnumerator IEnumerable.GetEnumerator() {
      return GetEnumerator();
    }
  }
0 голосов
/ 13 сентября 2018

Вам просто нужен метод Add, чтобы сделать эту работу и реализовать интерфейс IEnumerable:

class TestClass : IEnumerable<int>
{
    private List<int> Numbers = new List<int> ();

    public void Add(int n)
    {
        Numbers.Add(n);
    }

    public IEnumerator<int> GetEnumerator()
    {
        return Numbers.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

Компилятор распознает синтаксис инициализатора коллекции и попытается найти соответствующий метод Add.

...