C# 和匿名对象数组

Posted

技术标签:

【中文标题】C# 和匿名对象数组【英文标题】:C# and arrays of anonymous objects 【发布时间】:2011-01-03 08:23:15 【问题描述】:

这样的表达是什么意思?

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"...

如何手动创建这样的数组以适应此数据源。

【问题讨论】:

现在我认为将问题标题从“C#多维数组”更改为更合适的涉及“匿名对象数组”或类似的东西是安全的。 【参考方案1】:

首先,让我们重新格式化that code:

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 个对象组成的数组。数组中的这些对象属于anonymous type,使用new ... 创建和初始化。

关于您如何手动创建这样一个数组以适应数据源的问题:您似乎正在使用上面的代码做到这一点。

【讨论】:

像其他人一样正确答案。 +1 鼓励正确的格式。 您,先生,使用国王的格式。 (好吧,除了 Lin 字的 = 符号之间需要空格)。不过,我可以原谅这是一个意外。正确的格式可以大大减少错误并提高可读性。【参考方案2】:

这不是一个多维数组。这是一个使用object initializers with anonymous types 创建的对象数组。

【讨论】:

【参考方案3】:

看起来像一个匿名类型数组。

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

【讨论】:

引自文章:您可以通过组合隐式类型的局部变量和隐式类型的数组来创建匿名类型元素的数组,如下例所示。 var anonArray = new[] new name = "apple", diam = 4 , new name = "grape", diam = 1 ;【参考方案4】:

补充一点:匿名类型由编译器转换为真实对象。因此代码将被更改为与此等效的代码(非常简化,只是为了表明编译器将创建一个实际的类):

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

在我的一个程序中,我有这样的代码(简化了!):

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)。好处显然是我刚刚为这个对象创建了一个类。在我的示例中,所有对象也需要看起来相同。 (显然,对任何公共成员这样做都是一个坏主意,因为如果您添加/删除一些,编译器可能会更改匿名类的名称)

【讨论】:

【参考方案5】:

它正在创建一个新的对象数组,其中包含一组匿名对象。

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 

【讨论】:

【参考方案6】:

要从我使用的函数返回这样的数组:

public object GetAnonymousArray()

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

【讨论】:

以上是关于C# 和匿名对象数组的主要内容,如果未能解决你的问题,请参考以下文章

使用匿名对象列表查询数组

关于C#使用json,不能把匿名类对象转成json字符串吗

从数组/对象/集合中删除匿名 JavaScript 函数

Postgres:从匿名jsonb数组元素中删除对象

c#怎么定义对象数组?

c# json对象中含有数组,数组中又含有数组!