C # Передача массивов между классом A и классом B - PullRequest
2 голосов
/ 31 января 2011

Я пытаюсь получить array[i] из класса B в мой класс A.

В классе BI есть:

public array getArray() {
    return array[i];
}

Как мне получить полный array, чтобы сделатьэто работа?

combobox1.items.add(getArray());

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

Ответы [ 5 ]

1 голос
/ 31 января 2011

Вам нужно предоставить class A доступ ко всему массиву, а не только к одному значению.Например,

class B {
  Object[] _array;
  public Object[] GetArray() {
    return _array;
  }
}

Теперь class A может использовать все элементы и полностью заполнить поле со списком

foreach (object element in classBInstance.GetArray()) {
  combobox1.Items.Add(element);
}
0 голосов
/ 31 января 2011

Хотя другие ответы технически работают, по моему мнению, никогда не следует возвращать внутренний массив напрямую, поскольку это противоречит передовым методам объектно-ориентированного программирования.Поэтому я бы либо реализовал интерфейс IEnumerable в этом классе, либо, по крайней мере, возвратил бы IEnumerator или IEnumerable, что сделало бы возвращаемую коллекцию доступной только для чтения.

Пример:

class ClassB {
  int[] array;
  public IEnumerable<int> GetValues() { return array; }
}

class ClassA {
  void DoTheJob(ClassB source) {
    foreach(int item in source.GetValues()) {
      combobox.Items.Add(item);
    }
  }
}

Другое простое решение - добавитьФункциональность «делать со значениями» для класса B. Затем мы просто предоставляем делегат.Пример:

class ClassB {
  int[] array;
  public void DoWithValues(Action<int> action) {
    foreach(int item in array) action(item);
  }
}

class ClassA {
  ComboBox combobox;
  void DoTheJob(ClassB source) {
    source.DoWithValues(item => combobox.Items.Add(item));
  }
}

Следующий (третий) пример показывает, как сделать весь ClassB перечисляемым с помощью foreach:

static void Main(string[] args) {
  ClassB b = new ClassB();
  foreach(int i in b) Console.Write(i + " ");
}

class ClassB : IEnumerable<int> {

  int[] array;

  public ClassB() {
    array = new int[20];
  }

  public IEnumerator<int> GetEnumerator() {
    return (array as IEnumerable<int>).GetEnumerator();
  }

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

update: Как показано в ja72, это простоТехника, которая просто публикует перечислитель внутреннего массива, физически не скрывает массив, поскольку полученный IEnumerator может быть приведен обратно к int [].

update # 2: Мой брат всегда используетClone () для возврата копии массива.Он самый медленный, но он сказал, что это несколько раз спасало его карьеру (он работает над большим проектом в команде).

0 голосов
/ 31 января 2011

Ваш вопрос не очень понятен, поэтому я постараюсь ответить на основании того, что я понял как ваша проблема.

class A 
{
    string[] array;
    public string[] GetArray() { return array; }
}

тогда вы можете написать такой код, чтобы заполнить поле со списком

A items = new A();
// fill in array in A
comboBox1.DataSource = items.GetArray();

или

foreach(string item in items)
{
    comboBox1.Items.Add( item );
}

Я устанавливаю списки, используя элемент DataSource все время, особенно при переходе от enum s к строкам.

Пример:

comboBox1.DataSource = System.Enum.GetNames(typeof(System.DayOfWeek));
0 голосов
/ 31 января 2011

Хорошо, у вас есть ваш пример, но он нигде не инициирован, вам нужно передать его так:

public array getArray(int i)
{
    return array[i];
}



combobox1.items.add(getArray(5));
0 голосов
/ 31 января 2011

Вы должны перебрать свой массив:

foreach(var item in GetArray())
{
     combobox1.Items.Add(item);
}
...