Создание объектов динамически в цикле

У меня есть массив строк, через которые я зацикливаюсь. Я хотел бы перебрать массив и на каждой итерации создавать новый объект с именем, соответствующим строковому значению.

Например;

string[] array = new string[] { "one", "two", "three" };

class myClass(){

    public myClass(){
    }
}

foreach (string name in array)
{
   myClass *value of name here* = new myClass(); 
}

Результатом будет создание трех объектов с именами «один», «два» и "три".

Это возможно или есть лучшее решение?

Ответы на вопрос(9)

Вы можете использовать этот подход:

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

Неприменимо к C # или любому статически типизированному языку в этом отношении.

Для любопытства я попытался, если то, что я запомнил в PHP (создание переменных на лету), по-прежнему правильно.

Это все тот же PHP, последний из которых я использовал в 2000 году. Вы можете генерировать переменные на лету, не говоря о том, что это желательно, хотя это загрязняет глобальные переменные, оно может повредить некоторую существующую переменную или объект тем же самым название.

http://ideone.com/Xkpo1

<?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";

?>

Выходы:

The one: I'm tough!
The one: Says who? 1
Says who? 2
Says who? 3
Решение Вопроса

То, что вы пытаетесь сделать, невозможно в статически типизированном языке. 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!

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

Это потому, чтоYou cannot access object with dynamic names.

(Food for thoughtПросто подумайте, если вы могли бы сделать это, как вы получите к ним доступ, прежде чем они будут даже закодированы / названы.)

Вместо этого создайтеDictionary<string, myClass> как уже упоминалось.

Вы можете использовать списки для хранения объектов, чтобы вы могли получить к ним доступ

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

Вы можете использовать следующий код.

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

Вы могли бы сделать что-то вроде этого -

Dictionary<string, myClass> classes = new Dictionary<string, myClass>();

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

Затем вы можете обратиться к именованным экземплярам позже

classes[name].MyClassMethod();

Похоже, вам нужен список словарей ваших объектов:

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> вместо:

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

Ваш ответ на вопрос