在循环中动态创建对象

12
我有一个字符串数组,我正在循环遍历它。我想在循环遍历数组时,在每个迭代中创建一个新对象,其名称与字符串值匹配。
例如:
string[] array = new string[] { "one", "two", "three" };

class myClass(){

    public myClass(){
    }
}

foreach (string name in array)
{
   myClass *value of name here* = new myClass(); 
}
会实例化三个对象,它们的名称分别为“one”,“two”和“three”。是否有更好的解决方案?

为什么你需要这样做呢?你不能把类实例放在一个数组中,或者是一个Dictionary<string, myClass>中吗? - Joshua
9个回答

12

在静态类型语言中,你想做的是不可能的。根据我所知道的,在PHP中是可以实现的,但这样做并不可取。

使用字典代替:http://ideone.com/vChWD

using System;
using System.Collections.Generic;

class myClass{

    public string Name { get; set; }
    public myClass(){
    }
}

class MainClass
{

    public static void Main() 
    {
        string[] array = new string[] { "one", "two", "three" };
        IDictionary<string,myClass> col= new Dictionary<string,myClass>();
        foreach (string name in array)
        {
              col[name] = new myClass { Name = "hahah " + name  + "!"};
        }

        foreach(var x in col.Values)
        {
              Console.WriteLine(x.Name);
        }

        Console.WriteLine("Test");
        Console.WriteLine(col["two"].Name);
    }
}

输出:

hahah one!
hahah two!
hahah three!
Test
hahah two!

谢谢您还演示了如何访问每个对象的属性 :) - user469453

5

虽然其他人给出了另一种选择,但没有人告诉你为什么他们建议你这样做。

那是因为您无法使用动态名称访问对象。

(值得思考的问题: 如果您可以这样做,在它们甚至被编码/命名之前,您将如何访问它们。)

相反,请创建一个Dictionary<string, myClass>,就像其他人提到的那样。


4

使用 Dictionary<String, myClass> 替代:

var dict= new Dictionary<String, myClass>();

foreach (string name in array)
{
    dict.Add(name, new myClass());
}

现在,您可以通过您的名称访问myClass实例:
var one = dict["one"];

或者在循环中:

foreach (string name in array)
{
    myClass m = dict[ name ];
}

1
您可以使用这种方法:

  var array = [srt1, srt2, str3];
  var other_array = [];

  for(var i = 0; i <  array.length; i++){
    other_array.push({
    name: array[i]
    })
  }

对于查找,通过筛选很容易找到所需的实例:

var instance1 = other_array.filter(function(result) {
return result.name == 'str1';
});

0

看起来你需要一个对象列表的字典:

var myClassDictionary = new Dictionary<string,myClass>();

foreach (string name in array)
{
  myClassDicationry.Add(name, new myClass());
}

// usage:
// myClass["one"] <- an instance of myClass

据我所知,没有任何一种编程语言可以让你在运行时定义变量名。


0
你可以像这样做 -
Dictionary<string, myClass> classes = new Dictionary<string, myClass>();

foreach(string name in array)
{
    classes[name] = new myClass();
}

然后您可以稍后引用这些命名实例

classes[name].MyClassMethod();

0
你可以使用以下代码。
string[] array = new string[] { "one", "two", "three" };
Dictionary<String, myClass> list;
class myClass(){

   public myClass(){
   list = new Dictionary<String, myClass>();
   }
 } 

 foreach (string name in array)
 {
    list.Add(name, new myClass())
 }

0

你可以使用列表来存储对象,以便于访问它们。

list<myClass> myClasses = new List<myClass>();
foreach (myClass object in myClasses)
{
    //preform interaction with your classes here 
}

0

不适用于C#,或者任何静态类型语言。

出于好奇,我尝试了一下我在PHP中记得的东西(动态创建变量)是否仍然正确。

它仍然是同样的PHP,我上次使用它是在2000年。你可以动态生成变量,但并不建议这样做,因为它会污染全局变量,可能会破坏一些具有相同名称的现有变量或对象。

https://ideone.com/nJDiou

<?php

class MyClass
{
    private $v;
    function __construct($x) {
        $this->v = $x;
    }
    public function getValue() {
        return $this->v;
    }
}

$one = new MyClass("I'm tough!");

echo "The one: " . $one->getValue() . "\n";

$i = 0;
foreach(array("one","two","three") as $h) {
   $$h = new MyClass("Says who? " . ++$i);
}

echo "The one: " . $one->getValue() . "\n";

echo $two->getValue() . "\n";
echo $three->getValue() . "\n";

echo "loop\n";

foreach(array("three","one","two") as $h) {
   echo $$h->getValue() . "\n";
}

?>

输出:

The one: I'm tough!
The one: Says who? 1
Says who? 2
Says who? 3
loop
Says who? 3
Says who? 1
Says who? 2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接