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

sur*_*gle 3 c# generics collections anonymous-types c#-4.0

我想创建一个可以迭代的匿名类型,接受一个字符串和一个字符串数组.目标是创建一个组列表,每个组包含人员:

我想知道像这样的伪代码是否可行:

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

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

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

以下代码适用于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;}       
}
Run Code Online (Sandbox Code Playgroud)

不使用匿名类型

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

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

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

谢谢

Ree*_*sey 5

你可以完成类似你的伪代码:

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

或者,如果你想要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" }));
Run Code Online (Sandbox Code Playgroud)

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

var m = new { Group = "Men", Members = new[] { "John", "Tom" } } 
var w = new { Group = "Women", Members = new[] { "Eve", "Anna" } };
Run Code Online (Sandbox Code Playgroud)

但是,将其分配为一个List<object>将使其无效,因为您将无法再按名称访问这些项目.但是,您可以将它们放入List<dynamic>并访问它们.

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