【问题标题】:How to create an anonymous type like this var c = List<string, string[]>()如何创建像这样的匿名类型 var c = List<string, string[]>()
【发布时间】:2012-10-19 06:37:12
【问题描述】:

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

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

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

正如Muzz 在 cmets 中指出的那样,我上面的伪代码没有使用匿名类型。 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&lt;string,string[]&gt;() 或匿名类型(如上)的东西运行?

谢谢

【问题讨论】:

  • 这里为什么要使用匿名类型?只创建一个类型来保存这些信息似乎更简单。
  • 你试过var foo = new List&lt;String, dynamic&gt;()吗? (dynamic关键字)
  • 我认为您对匿名类型和类型推断感到困惑。您的伪代码没有使用匿名类型。
  • @ReedCopsey 我有许多不同的类型我想添加 - 所以使用匿名类型会很好,所以我不必关心创建类型
  • @Muzz 据我了解文档 List 只能有一种类型。我在 LinqPad 中尝试过,但没有成功:var foo = new List&lt;string, dynamic&gt;(); foo.add("Men", string[]{"John","Tom"});

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


【解决方案1】:

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

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

或者,如果你想要List&lt;T&gt;

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&lt;object&gt; 将使其实际上无法使用,因为您将无法再访问按名称的项目。但是,您可以将它们放入 List&lt;dynamic&gt; 并访问它们。

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

【讨论】:

  • 感谢关于维护成本的指点。您使用字符串数组的示例很有帮助。我曾尝试过new string[]string[],但我现在可以看到new[] 是正确的方法。您会推荐使用 Dictionary 还是更好地创建类型(结构或类,如 Anity)?谢谢
  • @threeFourOneSixOneThree 这取决于它的使用方式 - 但总的来说,我更喜欢制作自定义类。这为您提供了世界上最好的东西,但需要预先输入一些额外的输入。
猜你喜欢
  • 2012-01-27
  • 2021-10-01
  • 2011-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-03-10
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多