3

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

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

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" } }

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

以下代码适用于 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[]>()或匿名类型(如上)的东西运行?

谢谢

4

1 回答 1

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" } };

但是,将其分配给 aList<object>将使其实际上无法使用,因为您将无法再按名称访问项目。但是,您可以将它们放入 aList<dynamic>并访问它们。

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

于 2012-10-29T22:03:44.110 回答