Установите/расширьте Список <T> длина в c#

Да, вы можете сделать это с помощью 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()

enter image description here

10
задан Community 23 May 2017 в 12:15
поделиться

3 ответа

Самый простой путь, вероятно, путем создания временного массива:

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 свойство будет использоваться так, чтобы выделение было сделано только однажды.

12
ответ дан 3 December 2019 в 23:52
поделиться
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 +

3
ответ дан 3 December 2019 в 23:52
поделиться

Почему Вы хотите сделать это? Основное преимущество Списка состоит в том, что это может вырасти по мере необходимости, итак, почему Вы хотите добавить много пустых или элементов по умолчанию к нему?

Разве это не лучше, что Вы используете массив в этом случае?

-2
ответ дан 3 December 2019 в 23:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: