在循环中动态创建对象

本文关键字:创建对象 动态 循环 | 更新日期: 2023-09-27 18:36:31

我有一个字符串数组,我正在循环。我想遍历数组,并在每次迭代时创建一个名称与字符串值匹配的新对象。

例如;

string[] array = new string[] { "one", "two", "three" };
class myClass(){
    public myClass(){
    }
}
foreach (string name in array)
{
   myClass *value of name here* = new myClass(); 
}

将导致实例化三个对象,名称为"一"、"二"和"三"。

这是可能的还是有更好的解决方案?

在循环中动态创建对象

你想做什么在静态类型语言中是不可能的。IIRC,这在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!

虽然其他人给了你一个替代方案,但没有人告诉你他们为什么推荐你。

这是因为您无法访问具有动态名称的对象。

值得深思的是:试想一下,如果你可以这样做,你将如何在它们被编码/命名之前访问它们。

而是像其他人提到的那样创建一个Dictionary<string, myClass>

请改用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 ];
}

您可以使用此方法:

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

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

var myClassDictionary = new Dictionary<string,myClass>();
foreach (string name in array)
{
  myClassDicationry.Add(name, new myClass());
}
// usage:
// myClass["one"] <- an instance of myClass

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

你可以做这样的事情——

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

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

classes[name].MyClassMethod();
您可以使用

以下代码。

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

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

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

不适用于 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