2015-10-07 2 views
1

В настоящее время я использую следующие C# код для заполнения List<dynamic> объекта с диапазоном целых чисел:заполнение списка <dynamic> из Enumerable.Range или списка <int>

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

Если ваш вход действительно 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>() работает нормально.

+0

Спасибо, я решил для 'Enumerable.Range (0, 100) .Cast () .ToList()', который кажется самым чистым решением. –

2

Вы можете использовать LINQ, как это:

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

или 'Cast ()', который (возможно) опрятный. –