从 Enumerable.Range 或列表<int> 填充列表<dynamic>

populating List<dynamic> from an Enumerable.Range or a List<int>

目前,我使用以下 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> 不是一个选项。

您可以像这样使用 LINQ:

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

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