【问题标题】:populating List<dynamic> from an Enumerable.Range or a List<int>从 Enumerable.Range 或 List<int> 填充 List<dynamic>
【发布时间】: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;

【问题讨论】:

    标签: c# list linq ienumerable


    【解决方案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(),这似乎是最干净的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2013-09-26
    • 2021-10-17
    • 2021-05-22
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多