从Enumerable.Range或List <int>填充List <dynamic>

时间:2015-10-07 16:31:21

标签: c# list ienumerable

目前,我使用以下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<dynamic>自动转换为List<T>

请注意,我正在与外部库进行交互,因此仅使用List<int>代替List<dynamic>不是一种选择。

2 个答案:

答案 0 :(得分:3)

您可以像这样使用LINQ:

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

答案 1 :(得分: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的那个,所以为什么不呢。

否则,在.ToList()正常工作后使用.Cast<dynamic>()