У меня есть класс «Элемент» со свойством «Index», которое используется для сортировки списка элементов. Когда я добавляю элементы в список, я хочу равномерно распределить новые элементы в соответствии с существующими элементами в списке.Добавить элементы равномерно в список
Это означает, что если у меня есть 6 элементов и хотите добавить 3 элемента результат должен выглядеть как на картинке ниже:
У меня есть проблема с моим кодом (смотрите ниже) до сих пор является его использует неправильный индекс, поэтому, если у меня есть 2 существующих элемента и добавьте 9 элементов, последний индекс элемента - 18, который я действительно не понимаю.
public List<Element> AddElements()
{
// The elements are inserted before this
List<Element> existingElements = new List<Element>();
List<Element> elementsToAdd = new List<Element>();
int elementsLeft = 1;
foreach (Element element in elementsToAdd)
{
// Generate the next index
int nextIndex = 1;
// Only proceed if any elements exists
if (existingElements.Count > 0)
{
// divisonResult = 12/4 = 3
double divisonResult = Math.Floor(Convert.ToDouble(existingElements.Count)/Convert.ToDouble(elementsToAdd.Count));
// modulusResult = 12 % 2 = 0
double modulusResult = Convert.ToDouble(existingElements.Count) % Convert.ToDouble(elementsToAdd.Count);
// NextPosition = (3 + 1) * 1 = 4
// NextPosition = (3 + 1) * 2 = 8
// NextPosition = (3 + 1) * 3 = 12
// NextPosition = (3 + 1) * 4 = 16
if (modulusResult <= 0 && elementsToAdd.Count > 1)
nextIndex = Convert.ToInt16(divisonResult) * elementsLeft;
else
nextIndex = (Convert.ToInt16(divisonResult) + 1) * elementsLeft;
elementsLeft++;
// Move existing elements
var elementsToBeMoved = existingElements.Where(elementQuery => elementQuery.Index >= nextIndex);
foreach (Element elementToBeMoved in elementsToBeMoved)
{
elementToBeMoved.Index++;
}
}
// Add element to existing elements
existingElements.Add(new Element { Index = nextIndex });
}
// Return new list
return existingElements;
}
Что это? Не будучи легкомысленным, я просто думаю, что запрос интересен, но я не вижу, что вы будете использовать его немедленно. –
Это звучит неплохо. Вы получите ужасную производительность при вставках в List, потому что она должна скопировать все элементы после того, который вы вставляете в первую очередь. Если ваш список длиннее нескольких элементов, это может быть узким местом. Какую проблему ты пытаешься решить? Вероятно, есть лучший способ сделать это, чем равномерно распределить элементы в списке ... – Luaan
'Convert.ToDouble (existingElements.Count)/Convert.ToDouble (elementsToAdd.Count)' это просто: '1.0 * existingElements.Count/elementsToAdd.Count'. Или, может быть, использовать '(double)' cast. Почему все люди настаивают на использовании машин «Convert» для таких простых вещей: 0 – BartoszKP