我正在寻找创建由匿名类型组成的集合的最佳实践。
有几种方法——this一个也是最多的答案this线程假设可以在一条语句中构造整个匿名集合。
由于匿名类型通常用于替换用于存储临时的类(如中提出的)这个答案),我想避免创建和使用匿名集合的类,因为这个帖子建议。
就我而言,我正在迭代一个集合 - 对于集合中的每个项目,我希望以匿名类型收集相关对象(充当元组)。我需要将这些匿名类型放入一个集合中,然后对它们进行排序以进行进一步的工作。
我考虑过的其他方法:
- 使用 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<T>
出去。 Marc 的解决方案将比调用稍微高效一些ToList()
由于不需要额外的复印,但我think在大多数情况下,我可能会使用“数组然后 ToList()”解决方案,因为这样不会那么混乱。当然,如果性能对于那段代码至关重要,那么事情就会改变。
编辑:当您迭代集合时,只需使用Select
:
var anonymousItems = items.Select (item => new { Foo=item.Foo,
Bar=item.Other })
.ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)