РЕДАКТИРОВАТЬ: Вы изменили то, что вы просили, с вашими правками.Вы перешли от одного вопроса к новому подходу и задали новый вопрос.Вероятно, следует открыть новый вопрос для вашего нового подхода, так как этот теперь запутывает вопрос о том, какой ответ / ответ на какой вопрос / комментарий.Я полагаю, что на ваш первоначальный вопрос о сортировке равных приоритетов был дан ответ.
Вы можете использовать long, чтобы учесть больше значений.В конце концов, вы всегда достигнете конца, поэтому вам нужно будет использовать новый шаблон для уникальных значений или «пересчитывать» элементы при достижении максимального значения (переберите каждый из них и сбросьте уникальное значение счетчика).
Может быть, вместо этого использовать GUID для каждого элемента?
Guid.NewGuid()
РЕДАКТИРОВАТЬ:
Чтобы добавить после редактирования: Если вы хотите, чтобы новый 1 был помещен после существующего, В переопределении Сравнить, верните большеечем результат (1), когда значения равны.Таким образом, произойдет следующее:
1 > 0, return greater (1), continue
1 > 0, return greater (1), continue
1 == 1, return greater (1), continue
1 < 2, return less than (-1), insert
РЕДАКТИРОВАТЬ 2:
Если второй параметр предназначен только для уникального значения, вы всегда можете использовать строку и установить значение как числовоеСтроки вместо.Таким образом, вы никогда не достигнете предела, просто нужно будет соответственно проанализировать строку.Вы можете использовать начальные альфа-значения, которые представляют новый набор.
Я не проверял этот код, просто представление о том, что вы могли бы сделать.
static string leadingStr = "";
static char currentChar = 'a';
static Int32 currentId = Int32.MinValue;
static string getNextId()
{
if (currentId >= Int32.MaxValue)
{
currentId = Int32.MinValue;
if (currentChar >= 'z')
{
currentChar = 'a';
leadingStr = leadingStr.Insert(0, "X");
}
else
currentChar++;
}
else
currentId++;
return String.Format("{0}{1}-{2}", leadingStr, currentChar, currentId);
}
РЕДАКТИРОВАТЬ 3: Сбросить значения
static Int64 currentValue = Int64.MinValue;
static void AddItem(object item)
{
if (currentValue == Int64.MaxValue)
RecountItems();
item.counter = currentValue++;
SortedList.Add(item);
}
static void RecountItems()
{
currentValue = 0;
foreach (var item in SortedList)
{
item.counter = currentValue++;
}
}
Редактировать 4: Для вашего второго вопроса:
Вы можете использовать стек FIFO, как обычно, но также иметь список приоритетов, в котором хранится только уникальный идентификатор элементов.Однако тогда вам нужно будет удалять элемент из списка каждый раз, когда вы удаляете из стека FIFO.
static Object RemoveNextFIFO()
{
if (fifoList.Count > 0)
{
var removedItem = fifoList[0];
fifoList.RemoveAt(0);
RemoveItemFromPriority(removedItem);
return removedItem;
}
}
static void RemoveItemFromPriority(Object itemToRemove)
{
foreach (var counter in priorityQueue)
{
if (counter == itemToRemove.counter)
{
priorityQueue.remove(item);
break;
}
}
}
static Object RemoveFromFIFO(int itemCounter)
{
foreach (var item in fifoList)
{
if (item.counter == itemCounter)
{
fifoList.Remove(item);
return item;
}
}
}
static Object RemoveNextPriority()
{
if (priorityQueue.Count > 0)
{
var counter = priorityQueue.Pop();
return RemoveFromFIFO(counter);
}
}