声明匿名类型列表

Kri*_*hna 74 c# asp.net anonymous-types c#-3.0

有没有办法声明匿名类型的列表对象.我的意思是

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

这是因为我需要在运行时创建一个集合.提前致谢

小智 80

动态怎么样?

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


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

  • `dynamic` =没有intellisense.谢谢,但没有.甚至丑陋的元组的'Item1`也更好. (10认同)

Jar*_*Par 61

它涉及一些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"}}
                );
Run Code Online (Sandbox Code Playgroud)

  • 确认.这很聪明,而且很有效,但如果我的任何开发人员在实际工作中做过这件事,我会非常生气......但是,对于漂亮的诡计来说,+1. (22认同)
  • 这比在LINQ中使用匿名类型更糟糕吗? (12认同)
  • @Krishna:也有充分的理由;) (3认同)
  • 或者更简洁(假设您可以使用 System.Linq 命名空间)`((new[] { new { /* fields */ } }).ToList()` (2认同)

Dav*_*ton 53

你可以制作一个这样的列表,但你将再次使用一些严重的hackery,你将不得不使用一些"逐个例子"的情况.例如:

// 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" } });
Run Code Online (Sandbox Code Playgroud)

  • 好的 - 这又是一个聪明的,同时也是恐怖的...... +1 (13认同)
  • 聪明,以前没见过内联技巧 (2认同)

Eri*_*ert 26

一般情况下,您可以使用其他人提到的示例技巧(可以说是难闻的)来创建使用类型参数的匿名类型参数化的任何泛型类型的实例.但是,因为List<T>有一个稍微不那么粗略的方法:

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

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

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

我们称之为"mumble types",因为你当然读过它"myList是一个新的hrmmf列表".:-)

这个想法是编译器会查看初始化器并尽力弄清楚类型可能是什么,就像"var"意味着"查看初始化器并找出变量的类型是什么"一样".我们是否使用"var"作为"mumble"或"?" (类似于Java在相关功能中所做的那样),或其他东西是一个开放的问题.

无论如何,如果我是你,我不会屏住呼吸等待这个功能.到目前为止,它还没有针对几种语言版本进行剪辑,但我认为它会在一段时间内保留在可能性列表中.假设,假设我们要设计该语言的未来版本.我们可能会或可能不会.请记住,Eric对未来C#版本的思考仅用于娱乐目的.


Ree*_*sey 15

你不能像这样建立一个匿名类型的集合.

如果您需要这样做,您需要使用List<object>或为您的类型创建自定义类或结构.


编辑:

我会改写这个:

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

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


而且只是为了玩,这里是我的"我真的不想在现实世界中使用的代码"的条目:

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

  • 同意.我认为一个好的经验法则是,如果你担心匿名类型对象的类型,那么你正在做(或做好准备)做错事. (2认同)

Ian*_*cer 13

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

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

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


Jon*_*han 9

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

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

}
Run Code Online (Sandbox Code Playgroud)