web-dev-qa-db-ja.com

C#と匿名オブジェクトの配列

そのような表現はどういう意味ですか?

obj.DataSource = new[]
{
    new {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
    new {Text = "IIS 7", Count = 11, Link="http://iis.net" },
    new {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
    new {Text = "C#", Count = 13, Link="/Tags/C#" },
    new {Text = "Azure", Count = 13, Link="?Tag=Azure" }
};

特に次の行:new {Text = "IIS 7" ...}

このデータソースに合わせて、このような配列を手動で作成するにはどうすればよいですか。

48
Yevhen

それは多次元配列ではありません。これは、 匿名型のオブジェクト初期化子 を使用して作成されたオブジェクトの配列です。

40
Mark Byers

最初に、 そのコード 少し再フォーマットしましょう:

obj.DataSource = new[]
{
    new {  Text = "Silverlight",  Count = 10,  Link = "/Tags/Silverlight"  },
    new {  Text = "IIS 7",        Count = 11,  Link = "http://iis.net"     }, 
    new {  Text = "IE 8",         Count = 12,  Link = "/Tags/IE8"          }, 
    new {  Text = "C#",           Count = 13,  Link = "/Tags/C#"           },
    new {  Text = "Azure",        Count = 13,  Link = "?Tag=Azure"         } 
};

これは多次元配列ではなく、5つのオブジェクトの配列のように見えます。配列内のこれらのオブジェクトは 匿名型 であり、new { ... }を使用して作成および初期化されます。

質問については、データソースに合わせてこのような配列を手動で作成する方法については、上記のコードでまさにそれを行っているようです。

58
stakx

匿名型の配列のように見えます。

http://msdn.Microsoft.com/en-us/library/bb397696.aspx

4
Kris Krause

追加するだけ:匿名型はコンパイラによって実際のオブジェクトに変換されます。そのため、コードはこれに相当するものに変更されます(コンパイラーが実際のクラスを作成することを示すためだけに簡略化されています)。

internal sealed class AnonymousClass1
{
    internal string Text { get; set; }
    internal int Count { get; set; }
    internal string Link { get; set; }
}

そして、コードは次のように変更されます。

obj.DataSource = new AnonymousClass1[]
{
    new AnonymousClass1 {Text = "Silverlight", Count = 10, Link="/Tags/Silverlight" },
    new AnonymousClass1 {Text = "IIS 7", Count = 11, Link="http://iis.net" },
    new AnonymousClass1 {Text = "IE 8", Count = 12, Link="/Tags/IE8" },
    new AnonymousClass1 {Text = "C#", Count = 13, Link="/Tags/C#" },
    new AnonymousClass1 {Text = "Azure", Count = 13, Link="?Tag=Azure" }
};

私のプログラムの1つには、次のようなコードがあります(簡略化されています!)。

var myObjects = new []{
    new { Id = Guid.NewGuid(), Title = "Some Title", Description = string.Empty },
    new { Id = Guid.NewGuid(), Title = "Another Title", Description = string.Empty },
    new { Id = Guid.NewGuid(), Title = "Number 3", Description = "Better than No2, but not much" }
}

foreach(var myObject in myObjects) {
    DoSomeThingWith(myObject.Title);
}

これは、舞台裏の別のクラス(私もIntelliSenseを取得している)であるため機能します。利点は、このオブジェクトのクラスを作成することから自分を救ったことです。私の例では、すべてのオブジェクトも同じように見える必要があります。 (明らかに、パブリックメンバーに対してこれを行うことは、コンパイラを追加/削除すると匿名クラスの名前が変更される可能性があるため、悪い考えです)

3
Michael Stum

匿名オブジェクトのグループを含む新しいオブジェクト配列を作成しています。

new {Text = "Azure", Count = 13, Link="?Tag=Azure" }

phpのような構文のようなハッシュを作成するのではなく、Test、Count、Linkの各プロパティが設定された実際のオブジェクトを作成します。

匿名オブジェクトの優れた入門書を見つけることができます here

同じ構文を使用して、次のような新しい構造を作成できる必要があります。プロパティ値は定数である必要はありません。

string text = "Azure";
int count = 13;
string link =  "?Tag=Azure";
new {Text = text, Count = count, Link=link }
2
anq

私が使用した関数からそのような配列を返すには:

public object GetAnonymousArray()
{
    var tbl = new List<object>();
    while (___)
    {
        //fill array in cycle
        tbl.Add(new {Text = someString, Count = someInt, Link = link});
    }  
    return tbl;
}
1
Yevhen