从 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()
可以正常工作。
目前,我使用以下 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()
可以正常工作。