【问题标题】:Declaration of Anonymous types List [duplicate]匿名类型列表的声明[重复]
【发布时间】:2010-02-24 16:24:08
【问题描述】:

有没有办法声明一个匿名类型的列表对象。我是说

List<var> someVariable = new List<var>();
someVariable.Add(
             new{Name="Krishna", 
                 Phones = new[] {"555-555-5555", "666-666-6666"}}
                );

这是因为我需要在运行时创建一个集合。

【问题讨论】:

  • 我不明白使用匿名类型的 List 的意义何在。
  • 它们有一些用例。例如,当您需要将 LINQ-to-SQL 查询与内存支持的集合混合使用时。

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


【解决方案1】:

动态怎么样?

List<dynamic> dynamicList = new List<dynamic>();


dynamicList.Add(new { Name = "Krishna",  Phones = new[] { "555-555-5555", "666-666-6666" } }); 

【讨论】:

  • 感谢@JaiKannah,绝对应该是 .NET 4.x 的答案。让我们更接近 PHP 数组的灵活性,而无需担心。
  • 与其他解决方案相比,这是一个更好的解决方案...
  • dynamic = 没有智能感知。谢谢,但没有。即使是丑陋的元组Item1 也更好。
【解决方案2】:

这涉及到一些hackery,但可以做到。

static List<T> CreateListFromSingle<T>(T value) {
  var list = new List<T>();
  list.Add(value);
  return list;
}

var list = CreateListFromSingle(
   new{Name="Krishna", 
                 Phones = new[] {"555-555-5555", "666-666-6666"}}
                );

【讨论】:

  • 确认。这很聪明,而且很有效,但如果我的任何开发人员在实际工作中这样做过,我会非常生气......不过,+1 是为了巧妙的诡计。
  • @Reed,同意看起来很痛苦,但它有效
  • @Krishna:也有充分的理由 ;)
  • 这比在 LINQ 中使用匿名类型更糟糕吗?
  • 或者更简洁明了(假设你可以使用 System.Linq 命名空间)((new[] { new { /* fields */ } }).ToList()
【解决方案3】:

您可以像这样创建一个列表,但您将不得不再次使用一些严肃的黑客技术,并且您必须使用一些“举例说明”的情况。例如:

// create the first list by using a specific "template" type.
var list = new [] { new { Name="", Phones=new[] { "" } } }.ToList();

// clear the list.  The first element was just an example.
list.Clear();

// start adding "actual" values.
list.Add(new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } });

【讨论】:

  • 好的 - 这又是聪明的,同时看也很可怕...... +1
  • 聪明,以前没见过这种内联技巧
  • 谢谢,我会留着以后用的。
  • @kervin,在这种情况下,我相当确定编译器会这样做。如果您创建两个具有相同类型的相同命名参数的匿名类型,则会生成一个匿名类型。在任何情况下,如果它不编译此代码将发出错误
  • 可以在一行中声明:new [] { new { Name="", Phones=new[] { "" } } }.Where(x => false).ToList() ;
【解决方案4】:

一般来说,您可以使用其他人提到的(可以说是难闻的)通过示例转换的技巧来创建任何使用匿名类型参数化的泛型类型的实例作为类型参数。但是,对于List&lt;T&gt;,有一种稍微不那么粗暴的方法:

var array = new[] {
  new {  
    Name="Krishna",  
    Phones = new[] {"555-555-5555", "666-666-6666"}
  }
};
var list = array.ToList();

您提出的语法草图类似于我们没有为 C# 3 或 4 实现的功能,但我们考虑过。我们称这个特性为“mumble types”,它会是这样的:

List<?> myList = new List<?>() {
  new {  
    Name="Krishna",  
    Phones = new[] {"555-555-5555", "666-666-6666"}
  }
};

我们称它为“mumble types”,因为您当然会读到它“myList 是一个新的 hrmmf 列表”。 :-)

这个想法是编译器会查看初始化程序并尽力找出可能的类型,就像“var”的意思一样“查看初始化程序并找出类型变量是”。我们是否会使用“var”作为“mumble”或“?” (这类似于 Java 在相关功能中所做的),或者其他什么是一个悬而未决的问题。

无论如何,如果我是你,我不会屏住呼吸等待这个功能。到目前为止,它还没有在几个语言版本中脱颖而出,但我认为它会在可能性列表中停留一段时间。如果,假设地说,我们要设计该语言的未来版本。我们可能会也可能不会。请记住,Eric 对 C# 未来版本的思考仅供娱乐。

【讨论】:

  • +1 表示好名(“mumble types”),+1 表示没有实现它。我想这样做的成本并不便宜,而且解决它很容易,而且更易于维护......
【解决方案5】:

这是一种比许多其他建议更简洁的方法:

var list = Enumerable.Repeat(new { Name = "", Phones = new[] { "" } }, 0)
               .ToList();

// ...
list.Add(new { Name = "Krishna", 
               Phones = new[] { "555-555-5555", "666-666-6666" } });

【讨论】:

  • 非常优雅的解决方案 - 谢谢您的好心先生。
【解决方案6】:

你不能像这样创建匿名类型的集合。

如果您需要这样做,您需要使用List&lt;object&gt;,或者为您的类型创建一个自定义类或结构。


编辑:

我会改写:

虽然从技术上讲,可以创建一个匿名类型的列表,但我强烈建议不要这样做。几乎总是有更好的方法,因为这样做只会使代码几乎无法维护。我强烈建议使用自定义类型来保存您的值,而不是使用匿名类型。

自定义类型将具有所有相同的功能(因为匿名类型是由编译器在编译时定义的),但后续开发人员会更容易理解......


也只是为了玩,这里是我的“我永远不想在现实世界中使用的代码”的条目:

var customer = new { Name = "Krishna", Phones = new[] { "555-555-5555", "666-666-6666" } };
var someVariable = new[]{1}.Select(i => customer).ToList();

【讨论】:

  • 同意。我认为一个好的经验法则是,如果您担心匿名类型对象的类型,那么您正在(或准备)做错事。
  • +1 创建自定义类型需要半秒钟,并且可以节省数小时的调试难以管理/令人困惑的代码。
【解决方案7】:

我花了很多时间试图找到一种方法来使用匿名类型列表来节省一些时间,然后意识到在当前类中使用私有类可能更快...

private class Lookup {
    public int Index;
    public string DocType;
    public string Text;
}
private void MyMethod() {
    List<Lookup> all_lookups = new List<Lookup> {
        new Lookup() {Index=4, DocType="SuperView", Text="SuperView XML File"},
        new Lookup() {Index=2, DocType="Word", Text="Microsoft Word Document"}
    };
    // Use my all_lookups variable here...

}

【讨论】:

    【解决方案8】:

    我认为这是不可能的。也许在 C# 4 中使用 dynamic 关键字?

    【讨论】:

    • 你可以,但这不是一个好主意。这是为什么有些人认为dynamic 关键字会被滥用的一个很好的例子。
    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多