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」という名前の 3 つのオブジェクトがインスタンス化されます。

これは可能ですか、それともより良い解決策がありますか?

4

9 に答える 9

12

あなたがしようとしていることは、静的に型付けされた言語では不可能です。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!
于 2012-06-07T11:27:17.310 に答える
5

他の人はあなたに代替品を与えましたが、なぜそれを勧めるのか誰も教えてくれません.

これは、動的な名前のオブジェクトにアクセスできないためです。

(検討材料: コード化/名前付けされる前に、アクセスできるかどうか少し考えてみてください。)

代わりにDictionary<string, myClass>、他の人が述べたように a を作成します。

于 2012-06-07T11:17:09.590 に答える
4

Dictionary<String, myClass>代わりにaを使用します。

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 ];
}
于 2012-06-07T11:17:52.587 に答える
0

オブジェクトの辞書のリストが必要なようです:

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

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

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

私が知っているプログラミング言語で、実行時に変数名を定義できるものはありません。

于 2012-06-07T11:18:59.513 に答える
0

あなたはこのようなことをすることができます -

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

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

その後、名前付きインスタンスを後で参照できます

classes[name].MyClassMethod();
于 2012-06-07T11:19:10.087 に答える
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())
 }
于 2012-06-07T11:19:18.070 に答える
0

リストを使用してオブジェクトを保存し、それらにアクセスできるようにすることができます

list<myClass> myClasses = new List<myClass>();
foreach (myClass object in myClasses)
{
    //preform interaction with your classes here 
}
于 2012-06-07T11:20:31.710 に答える
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
于 2012-06-07T11:42:03.370 に答える