Да, вы можете сделать это с помощью loop +, используя wedgeprops
, как Криштиану Келер предложил в другом ответе:
import matplotlib.pyplot as plt
recipe = "flour", "sugar", "egg", "butter", "milk", "yeast"
fracs = [15, 30, 45, 10]
data = [225, 90, 50, 60, 100, 5]
fig = plt.figure()
for i in range(2):
ax = fig.add_axes([i/2, .1, .5, .5], aspect=1)
ax.pie(data, labels=recipe, radius=1.2, wedgeprops={'width': 0.5})
ax.set_title('A donut {}'.format(i+1), y=1.1)
plt.text(0, -1.6, 'Description {}'.format(i+1), ha='center')
plt.savefig('donut1.png')
plt.show()
Самый простой путь, вероятно, путем создания временного массива:
list.AddRange(new T[size - count]);
Где size
необходимый новый размер, и count
количество объектов в списке. Однако для относительно больших значений (size - count
, это может иметь плохую производительность, так как она может заставить список перераспределять многократно.*
) Это также имеет недостаток выделения дополнительного временного массива, который, в зависимости от Ваших требований, может не быть приемлемым. Вы могли смягчить обе проблемы за счет более явного кода, при помощи следующих методов:
public static class CollectionsUtil
{
public static List<T> EnsureSize<T>(this List<T> list, int size)
{
return EnsureSize(list, size, default(T));
}
public static List<T> EnsureSize<T>(this List<T> list, int size, T value)
{
if (list == null) throw new ArgumentNullException("list");
if (size < 0) throw new ArgumentOutOfRangeException("size");
int count = list.Count;
if (count < size)
{
int capacity = list.Capacity;
if (capacity < size)
list.Capacity = Math.Max(size, capacity * 2);
while (count < size)
{
list.Add(value);
++count;
}
}
return list;
}
}
Единственный C# 3.0 здесь является использованием"this
"модификатор для создания их дополнительными методами. Удалите модификатор, и он будет работать в C# 2.0.
К сожалению, я никогда не сравнивал производительность этих двух версий, таким образом, я не знаю, какой лучше.
О, и сделал Вы знаете, что могли изменить размер массива путем вызова Array.Resize<T>
? Я не знал это.:)
Обновление:
(*
) Используя list.AddRange(array)
не заставит перечислитель использоваться. Взгляд далее через Отражатель показал, что массив будет литым к ICollection<T>
, и Count
свойство будет использоваться так, чтобы выделение было сделано только однажды.
static IEnumerable<T> GetValues<T>(T value, int count) {
for (int i = 0; i < count; ++i)
yield return value;
}
list.AddRange(GetValues<object>(null, number_of_nulls_to_add));
Это будет работать с 2,0 +
Почему Вы хотите сделать это? Основное преимущество Списка состоит в том, что это может вырасти по мере необходимости, итак, почему Вы хотите добавить много пустых или элементов по умолчанию к нему?
Разве это не лучше, что Вы используете массив в этом случае?