web-dev-qa-db-ja.com

C#のJavascriptオブジェクト

次のJSコードのようなものを作成する簡単な方法はありますか?

var players = [
    {name:"Joe",score:25,color:"red",attribs:[0,1,2,3,4]},
    {name:"Jenny",score:1,color:"black",attribs:[4,3,2,1,0]}
];

in C#(Unity 3dの場合)?

List、Dictionary、ArrayListについてはすでに見てきましたが、すべてが継ぎ目があり、柔軟性がなく、複雑すぎます...

ここでの主な目的は、配列インデックスや変数タイプなどを覚えておく必要がなく、他の多くの場所からアクセスできる柔軟なものを用意することです。おそらくC#では実行できません...しかし、かなり近いものは必要です。足ります。 ArrayList多分...?

ありがとうございました。

17
user3789335

オブジェクトの配列であるこのJavaScriptはC#に直接転送可能であり、それを行うための複数の方法と使用する複数のコレクションクラスがあります(コレクションクラスが1つしかないJavaScriptとは異なります)

これは、C#でほぼ逐語的に記述でき、完全に有効です(匿名型の使用)。

var players = new [] {
    new  {name = "Joe",score = 25, color = "red", attribs = new int[]{ 0,1,2,3,4}},
    new  {name = "Jenny",score = 1, color = "black", attribs = new int[]{4,3,2,1,0}}
};

しかし、これがあなたが望むものを達成するかどうかはわかりません(機能的に)

型付きオブジェクトを作成するIMOの方が優れたアプローチであるため(C#とJavaScriptの両方でこれが優れたアプローチであると考えます)、次のようにアプローチします(JavaScript)。

function Player(name,score,color,attribs)
{
    this.name = name;
    this.score = score;
    this.color = color;
    this.attribs = attribs;
}

var players = [
    new Player("Joe", 25, "red", [0, 1, 2, 3, 4]),
    new Player("Jenny",1,"black", [4, 3, 2, 1, 0])
];

そしてC#でも同じこと:

public class Player
{
    public string name;
    public int score;
    public string color;
    public int[] attribs;
}


Player[] players = new Player[]{
         new Player(){ name = "Joe", score = 25, color = "red", attribs = new int[]{0,1,2,3,4} },
         new Player(){ name = "Jenny", score = 1, color = "black", attribs = new int[]{4,3,2,1,0} },
};

または、より多くの柔軟性を得るには、次のようなリストでそれらを使用できます。

 List<Player> players = new List<Player>(){
             new Player(){ name = "Joe", score = 25, color = "red", attribs = new int[]{0,1,2,3,4} },
             new Player(){ name = "Jenny", score = 1, color = "black", attribs = new int[]{4,3,2,1,0} },
    };
17
OJay

構文にほぼ一致するのは匿名型です。

var players = new[]{
    new {name = "Joe", score = 25, color = "red", attribs = new[]{0,1,2,3,4}},
    new {name = "Jenny", score = 1, color = "black", attribs = new []{4,3,2,1,0}}
};

ただし、JavaScriptとは非常に異なる意味を持ちます(C#の不変の強い型のオブジェクトの配列とJavaScriptのダック型のオブジェクトの辞書)。

Unity3dに存在する場合、.NetでJavaScriptなどの言語をサポートするために存在するdynamicおよび ExpandoObject の使用を検討することをお勧めします。

    dynamic person = new System.Dynamic.ExpandoObject();
    person.Name = "John Smith";
    person.Age = 33;

C#は強く型付けされた言語であるため、言語に合わせて考え方を変更することをお勧めします。ダックタイピングされた言語から逃れることができない場合は、JavaScriptを使用するのが妥当なオプションです。

3
Alexei Levenkov

PlayerNameScoreColorプロパティを使用してAttribsモデル(クラス)を作成し、各Player _List<Player>_のメモリ内:

_public class Player
{
    public string Name { get; set; }
    public int Score { get; set; }
    public string Color { get; set; }
    public int[] Attribs { get; set; }
}

...

List<Player> myPlayers = new List<Player>();
Player joe = new Player();
joe.Name = "Joe";
joe.Score = 25;
joe.Color = "red;
joe.Attribs = new int[] { 0, 1, 2, 3, 4 };;
myPlayers.Add(joe);
_

_System.Linq_を使用して、特定のプレーヤーの_List<Player>_をクエリできます。例:

Player player = myPlayers.SingleOrDefault(p => p.Name == "Joe");

追加のクレジット-使用する前に、プレーヤーがデフォルトではないことを常にテストしてください。

_if (player != default(Player))
{
    // do something with joe
}
_
3
logikal