我正在寻找创建匿名类型集合的最佳实践.
有几种方法 - 这个和大多数答案在这个线程上假设整个匿名集合可以在一个语句中构造.
由于匿名类型通常用于替换用于存储临时的类(如本SO答案中所提出的),我想避免为匿名集合创建和使用类,如本文所述.
在我的情况下,我正在迭代一个集合 - 对于集合中的每个项目,我想以匿名类型(充当元组)收集相关对象.我需要将这些匿名类型放入集合中,然后对它们进行排序以进行进一步的工作.
我考虑的其他方法:
使用object []或ArrayList(失去匿名类型的好处)
为所需项创建包装类(不再需要匿名类型)
这是我的代码中唯一需要这样一个集合的地方 - 最好的方法是什么?
附加信息:
我正在使用遗留的.Net 1.1对象,因此我正在使用的集合是实现IEnumerable的强类型集合,因此大多数Linq扩展方法(如.Select)都不起作用:
代码示例
foreach (Item item in myItems) { foreach (Confirmation confirmation in item.GetConfirmations(true)) { if (lastParentId != item.ParentId) { lastParentId = item.ParentId; parentObject = new ParentItem(lastParentId); } itemHolder = new ArrayList { item, confirmation }; if (parentObject!= null) { itemHolder.Add(parentObject.Rate); } sortConfirmations.Add(confirmation.Date, itemHolder); } } // Use sortConfirmations
解析度
我最终使用通用字典一起收集相关项目并使用.OrderBy()对它们进行排序 - 很难看,但它有效......并且比现有代码更好.
如果您对数组感到满意,可以使用数组初始值设定项:
var items = new[] { new { Foo = "def" }, new { Foo = "ghi" }, new { Foo = "jkl" } };
ToList()
如果你想List
出去,你可以打电话.ToList()
由于不需要额外的复制,Marc的解决方案将比调用稍微更高效,但我认为在大多数情况下我可能会使用"数组然后ToList()"解决方案,因为杂乱性较小.当然,如果性能对于那段代码至关重要,那么它会改变一些事情.
编辑:当你在一个集合上迭代时,只需使用Select
:
var anonymousItems = items.Select (item => new { Foo=item.Foo, Bar=item.Other }) .ToList();
对于一个非常不同的答案...... LINQ?
在我的情况下,我正在迭代一个集合 - 对于集合中的每个项目,我想以匿名类型(充当元组)收集相关对象.我需要将这些匿名类型放入集合中,然后对它们进行排序以进行进一步的工作.
听起来像是:
var list = (from item in collection from related in item.Relationship order by ...something... select new {item,related}).ToList()