我想知道创建匿名类型列表是否是有效创建多种类型列表的最佳方法以及它对总体性能和效率的影响。主要是我只是想知道是否有更标准的 List 方法?
情况 我时不时地发现自己需要创建一个列表,其中包含多个不同类型的值,即 List。通常我会用字典来解决这个问题,但在某些情况下我不关心重复的键值或需要第三个(或很少是第四个)值。通常这是用于临时列表,它只跟踪方法中包含的内容,例如记录抛出的错误和关联值,以便在方法结束时我可以将日志文件或其他内容的消息串在一起。
到目前为止我所拥有的是:
var list = new[] { new { RowNumber = 1, Message = "" } }.ToList();
list.Clear();//clears out the example used to create the anonymous type
list.Add(new { RowNumber = 10, Message = "bla bla" }); //adding to the list
我正在考虑是否做一些扩展或其他事情来使这变得更容易,但如果性能很差或者有更好的方法,我想知道。
最佳答案
我只是experimented a little 。这是我发现的:
- 匿名类型和其他类型一样好。我不能真的说“任何东西”,因为我没有尝试所有的东西。但我可以告诉你,它们和
Tuple<>
一样好。和具体类型。这是合乎逻辑的,因为在幕后,编译器实际上为匿名类型构建类型。本质上,在运行时,它们只是具体类型。 - 您的
ToList
调用是多余的。这部分很重要。这与您眼前的问题并不是非常相关,但看看您的示例,您确实new [] { ... }.ToList()
。这会在创建数组后强制循环该数组。使用列表初始化会更好:new List<dynamic> { ... };
。这就是我在示例中使用的内容。
我针对以下各项运行了 10,000 次测试:
- 带有数组初始值设定项的匿名类型(总计 00:00:00.0050338)
- 带有列表初始值设定项的匿名类型(总计 00:00:00.0035599)
- 带有列表初始值设定项的元组(总计 00:00:00.0025857)
- 带有列表初始值设定项的具体类型(总计 00:00:00.0041538)
再次运行它们只会把它们搞混。唯一一致的结果是数组比直接访问列表慢,这并不奇怪。
如果您要创建扩展方法,您可能会选择后两个选项之一。匿名类型不能很好地超出其范围,我相信您知道。具体类型和元组之间的选择取决于您。如果你经常使用它和/或在原始方法之外使用它,我会选择具体的,如果它只需要存在于某个地方,我会选择元组。这确实是我无法为您做出的设计选择。
关于c# - 性能受到影响?匿名类型列表来实现类似 List<int, string, ...> (多种类型的多维列表)在 c# 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29041189/