C#在A类和B类之间传递数组

时间:2011-01-31 17:42:54

标签: c# arrays class methods

我想把B级的array[i]送到我的A级。

在B班我有:

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

如何才能获得完整的array才能使其发挥作用?

combobox1.items.add(getArray());

我正在尝试这个,但它不起作用。您能否回答一下代码示例,它解释了发送和获取array[i]的不同类中的两种方法。

5 个答案:

答案 0 :(得分:1)

您需要授予class A访问整个数组的权限,而不仅仅是单个值。例如

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

现在class A可以使用所有元素并完全填充组合框

foreach (object element in classBInstance.GetArray()) {
  combobox1.Items.Add(element);
}

答案 1 :(得分:-1)

你必须遍历你的数组:

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

答案 2 :(得分:-1)

你的例子,你有我,但它没有在任何地方发起,你需要像这样传递:

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



combobox1.items.add(getArray(5));

答案 3 :(得分:-1)

你的问题不是很清楚,所以我会根据我的理解来回答你的问题。

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转到字符串时。

示例:

comboBox1.DataSource = System.Enum.GetNames(typeof(System.DayOfWeek));

答案 4 :(得分:-2)

虽然其他答案在技术上有效,但在我看来,不应该直接返回内部数组,因为它违背了面向对象编程中的良好实践。所以我要么在该类中实现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类中添加“Do with values”功能。然后我们只提供委托。例如:

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));
  }
}

下一个(第三个)示例显示如何使用foreach使整个ClassB可枚举:

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();
  }
}

更新:正如ja72所示,这个简单的技术只发布内部数组的枚举器,不会物理隐藏数组,因为生成的IEnumerator可以转换回int []。

更新#2:我的兄弟总是使用Clone()来返回数组的副本。这是最慢的,但他说这几次挽救了他的职业生涯(他在团队中的一个更大的项目上工作)。