【问题标题】:C# and arrays of anonymous objectsC# 和匿名对象数组
【发布时间】: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#多维数组”更改为更合适的涉及“匿名对象数组”或类似的东西是安全的。

标签: c# asp.net .net arrays anonymous-types


【解决方案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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-26
          • 2013-06-06
          • 1970-01-01
          • 2012-04-27
          相关资源
          最近更新 更多