当前,我使用以下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>而不是是不可行的。

最佳答案

如果您输入的内容确实是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>()可以正常工作。

关于c# - 从Enumerable.Range或List <int>填充List <dynamic>,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32997681/

10-13 08:56
查看更多