如何创建这样的匿名类型var c = List <string,string [] =“”>()</string,>

时间:2012-10-29 21:56:06

标签: c# c#-4.0 generics collections anonymous-types

我想创建一个可以迭代的anonymous type,接受一个字符串和一个字符串数组。目标是创建一个组列表,每个组包含人员:

我想知道是否有类似 Pseudo-Code 的内容:

var myAnoty =new List<string, string[]>();
myAnoty.add("Programmers", ["Linus", "Bill", "Anders"]);
myAnoty.add("Users", ["John", "Melissa", "Bert"]);

正如Muzz在评论中指出的,我上面的伪代码没有使用匿名类型。下面的Reed Copsey回答是使用它们:var m = new { Group = "Men", Members = new[] { "John", "Tom" } }

不使用匿名类型的工作演示

以下代码works in LinqPad

void Main()
{
    List<Object> myAnoties = new List<Object>();
    myAnoties.Add(new Anoty {Group="Men",   Member=new string[]{"John","Tom"}} );
    myAnoties.Add(new Anoty {Group="Women", Member=new string[]{"Eve","Anna"}} );
    myAnoties.Dump();
}

// Define other methods and classes here
class Anoty{
    public string Group{get; set;}
    public string[] Member{get; set;}       
}

无法使用匿名类型

以下代码使用匿名类型。但不知何故,字符串数组不适用于匿名类型。

var m = new { Group= "Men", Member=string[]{"John","Tom"}};
var w = new { Group= "Women", Member=string[]{"Eve","Anna"}};
List<object> myAnoties = new List<object>();
myAnoties.Add(m);
myAnoties.Add(w);

有没有办法获得像我的伪代码var x = new List<string,string[]>()或具有匿名类型(如上所述)的东西?

由于

1 个答案:

答案 0 :(得分:5)

您可以完成类似伪代码的操作:

var myAnoty = new Dictionary<string, string[]>();
myAnoty.Add("Programmers", new[] { "Linus", "Bill", "Anders" });
myAnoty.Add("Users", new[] { "John", "Melissa", "Bert" });

或者,如果您想要List<T>

var myAnoty = new List<Tuple<string, string[]>>();
myAnoty.Add(Tuple.Create("Programmers", new[] { "Linus", "Bill", "Anders" }));
myAnoty.Add(Tuple.Create("Users", new[] { "John", "Melissa", "Bert" }));

您还可以在匿名类型中使用数组:

var m = new { Group = "Men", Members = new[] { "John", "Tom" } } 
var w = new { Group = "Women", Members = new[] { "Eve", "Anna" } };

但是,将其分配到List<object>会使其无法使用,因为您无法再按名称​​访问项目。但是,您可以将它们放入List<dynamic>并访问它们。

话虽这么说,我强烈建议重新考虑完全使用匿名打字的目标。对于要存储对象的情况,使用命名类型通常是优先的。匿名类型在这种情况下节省了一些输入,但增加了巨大的维护成本,因为它们增加了很多复杂性,并且你失去了很多安全性(即:没有适当的构造函数等)。创建自定义类型所需的额外时间通常远小于在您将持久保存值的情况下使用匿名类型的调试和维护成本。