从 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&lt;dynamic&gt; 对象:

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&lt;T&gt; 自动转换为 List&lt;dynamic&gt;

请注意,我正在与外部库进行交互,因此不能简单地使用 List&lt;int&gt; 而不是 List&lt;dynamic&gt;

【问题讨论】:

【参考方案1】:

您可以像这样使用 LINQ:

var x = Enumerable.Range(0, 100).Select(i => (dynamic) i).ToList();

【讨论】:

Cast&lt;dynamic&gt;(),(可以说)更整洁。【参考方案2】:

如果您的输入确实是 List&lt;int&gt;(甚至是 List&lt;T&gt;),则以下内容可以节省分配:

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&lt;dynamic&gt;() 之后使用.ToList() 可以正常工作。

【讨论】:

谢谢,我已经选择了Enumerable.Range(0, 100).Cast&lt;dynamic&gt;().ToList(),这似乎是最干净的解决方案。

以上是关于从 Enumerable.Range 或 List<int> 填充 List<dynamic>的主要内容,如果未能解决你的问题,请参考以下文章

Enumerable.Range 的高内存消耗?

为啥 Enumerable.Range 实现 IDisposable?

为啥 Enumerable.Range 比直接 yield 循环快?

使用 Enumerable.Range() 填充字典的问题

关于 Enumerable.Range 与传统 for 循环的 foreach 的思考

csharp 对于那些需要在一段时间内创建DropDownList的时候,您可以通过“Enumerable.Range”轻松完成。样本c