Создание объектов динамически в цикле
У меня есть массив строк, которые я перебираю. Я хотел бы перебирать массив и на каждой итерации создавать новый объект с именем, которое соответствует строковому значению.
например:
string[] array = new string[] { "one", "two", "three" };
class myClass(){
public myClass(){
}
}
foreach (string name in array)
{
myClass *value of name here* = new myClass();
}
приведет к созданию экземпляров трех объектов с именами "один", "два"и " три".
возможно ли это или есть лучше решение?
9 ответов
то, что вы пытаетесь сделать, невозможно в статически типизированном языке. 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>
вместо:
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 ];
}
в то время как другие дали вам альтернативный, но никто не говорит почему они рекомендуют вам, что.
потому что вы не можете получить доступ к объекту с динамическими именами.
(информация к размышлению: просто подумайте на мгновение, если вы могли бы сделать это, как вы получите к ним доступ, прежде чем они даже закодированы/названы.)
создать Dictionary<string, myClass>
Как уже упоминалось.
Вы можете использовать этот подход:
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 году. Вы можете генерировать переменные на лету, не говоря, что это целесообразно, хотя он загрязняет глобальные переменные, он может повредить некоторую существующую переменную или объект с тем же имя.
<?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