首页 > 解决方案 > 可单独寻址的变量的可迭代列表

问题描述

我需要构建一个变量列表(或数组、集合或其他),我既可以在循环中迭代这些变量,也可以在需要时单独寻址。说这些是我的变量:

double length = 5;
double width = 10;
double height = 7;
double weight = 14;

现在,所有这些变量都必须进入一个列表(或其他东西),我们称之为 myList。然后我应该能够像这样解决它们:

myList.length = 1;
myList.width = 3
myList.weight = 60;

但也像这样迭代,一次设置它们:

foreach (double item in myList)
{
   item = 15;
}

这只是一个原始示例,但列表中的项目可能是更复杂的类型,例如自定义类,所以我有时会像这样处理或迭代它们myList.item.value = 5;等等。但我想你明白了要点。

我怎样才能做到这一点?我知道最明显的方法是使用字典,但它只会存储伪名称(作为键中的字符串类型),所以我必须有一个带有变量名的单独类/结构,如下所示:

struct variableNames
{
   string length = "length"
   string width= "width"
   //...etc
}

然后像这样获取/设置值:

myDictionary[variableNames.width].value = 5;

这样,我会从我的 IDE 中获得变量名建议,编译器会捕获错误类型,但这是一种非常尴尬的处理方式。

我怀疑这也可以通过反射来完成(使 myList 成为一个类,变量将是它的全局变量,然后遍历该类的所有成员),但是反射相对较慢,并且性能在这里很重要。也许它也可以用指针来完成,但对于这么简单的事情来说,这似乎是不必要的复杂。

那么,解决此问题的最佳方法是什么?

标签: c#listloopsvariablesiteration

解决方案


使用面向对象。

public class Square
{
  double length = 5;
  double width = 10;
  double height = 7;
  double weight = 14;

  public Square()
  {
    length = 0;
    width = 0;
    height = 0;
    weight = 0;
  }
}

然后你可以实例化对象:

Square sq = new Square();
sq.length = 5;
sq.width = 5;
sq.height = 5;
sq.weight = 5;

并列一个清单:

List<Square> squares = new List<Square>;
squares.add(sq);

对于循环:

foreach (Square item in squares)
{
  item.length = 3;
  item.width = 3;
  item.height = 3;
  item.weight = 3;
}

推荐阅读