从 Enumerable.Range 或 List<int> 填充 List<dynamic>
Posted
技术标签:
【中文标题】从 Enumerable.Range 或 List<int> 填充 List<dynamic>【英文标题】:populating List<dynamic> from an Enumerable.Range or a List<int> 【发布时间】:2015-10-07 16:31:21 【问题描述】:目前,我使用以下 C# 代码用整数范围填充 List<dynamic>
对象:
var x = new List<dynamic>();
foreach (int i in Enumerable.Range(0, 100)) x.Add(i);
有没有更清晰的方法来做到这一点?我试过了
x = Enumerable.Range(0, 50).ToList();
还有
x = Enumerable.Range(0, 50).ToList<dynamic>();
但两者都会导致类型检查错误,大概是因为 C# 没有从 List<T>
自动转换为 List<dynamic>
。
请注意,我正在与外部库进行交互,因此不能简单地使用 List<int>
而不是 List<dynamic>
。
【问题讨论】:
【参考方案1】:您可以像这样使用 LINQ:
var x = Enumerable.Range(0, 100).Select(i => (dynamic) i).ToList();
【讨论】:
或Cast<dynamic>()
,(可以说)更整洁。【参考方案2】:
如果您的输入确实是 List<int>
(甚至是 List<T>
),则以下内容可以节省分配:
List<int> li;
var x = new List<dynamic>(li.Count);
x.AddRange(li.Cast<dynamic>());
如果您发现自己经常这样做,这是扩展方法的主要候选者:
static class CollectionExtensions
public static List<dynamic> ToDynamicList<T>(this ICollection<T> collection)
var result = new List<dynamic>(collection.Count);
result.AddRange(collection.Cast<dynamic>());
return result;
使用ICollection
而不是IList
不会增加很多,但是,ICollection
是引入Count
的那个,所以为什么不呢。
否则,在.Cast<dynamic>()
之后使用.ToList()
可以正常工作。
【讨论】:
谢谢,我已经选择了Enumerable.Range(0, 100).Cast<dynamic>().ToList()
,这似乎是最干净的解决方案。以上是关于从 Enumerable.Range 或 List<int> 填充 List<dynamic>的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Enumerable.Range 实现 IDisposable?
为啥 Enumerable.Range 比直接 yield 循环快?
关于 Enumerable.Range 与传统 for 循环的 foreach 的思考
csharp 对于那些需要在一段时间内创建DropDownList的时候,您可以通过“Enumerable.Range”轻松完成。样本c