После прочтения того, что вы написали 5 раз, я верю, что вы хотите:
print("[tr]")
while True:
counter = 0
UserInput = input("")
if UserInput == "exit":
exit(0)
print("[tr]", end = "")
while (counter !=5):
print ("[td][center]Label\n" + "[img]" + str(UserInput) + "[/img][/center][/td]")
counter += 1
print ("[/tr]")
print("[/tr]")
Итак, что здесь происходит, вы печатаете [tr] в той же строке, что и первый отпечаток изнутри, пока вы в розыске. [/ tr] находится в новой строке, но вы можете поместить ее в ту же строку, добавив end = "" и ко второму выводу.
Я использовал бы SortedList вместо словаря. Можно все еще получить доступ к нему Ключом, но можно получить доступ к нему индексом также.
SortedList sCol = new SortedList();
sCol.Add("bee", "Some extended string matching bee");
sCol.Add("ay", "value matching ay");
sCol.Add("cee", "Just a standard cee");
// Go through it backwards.
for (int i = sCol.Count - 1; i >=0 ; i--)
Console.WriteLine("sCol[" + i.ToString() + "] = " + sCol.GetByIndex(i));
// Reference By Key
foreach (string i in sCol.Keys)
Console.WriteLine("sCol[" + i + "] = " + sCol[i]);
// Enumerate all values
foreach (string i in sCol.Values)
Console.WriteLine(i);
стоит отметить, что отсортированный список хранит пары ключ/значение, отсортированные по ключу только.
Литеральный ответ:
Dictionary<int, SomeObject> myDictionary = new Dictionary<int, SomeObject>();
foreach (var pair in myDictionary.OrderByDescending(i => i.Key))
{
//Observe pair.Key
//Do stuff to pair.Value
}
Можно использовать LINQ to Объекты Счетный. Реверс () функционирует в.NET 2,0 использования LinqBridge.
Стандарт for
цикл был бы лучшим. Вы не должны волноваться об обработке наверху инвертирования набора.
Если Вы хотите набор типа словаря, но необходимо поддержать порядок вставки, можно изучить KeyedCollection здесь
, Это - слияние между словарем и списком. Тем путем можно получить доступ к элементам в наборе через ключ или индекс вставки.
единственный глюк - то, если Ваш элемент, сохраненный в наборе, должен иметь международный ключ. Если Вы могли бы изменить это на строку или другой тип (Гуид Mabye). Так как набор 1 будет искать ключ 1, а не индекс 1.
Единственным путем я могу придумать в .NET 2.0 должна сначала скопировать все значения в Список, инвертировать список и затем выполнить foreach в том списке:
Dictionary<int, object> d;
List<object> tmplist;
foreach (object o in d.Values) tmplist.Add(s);
tmplist.Reverse();
foreach (object o in tmplist) {
//Do stuff
}
Если упорядочивание является самым важным, Вы могли Вы Стек и создавать простую структуру для хранения интервала, Объектной пары.
Если у Вас нет.NET 3.5 и поэтому Обратный дополнительный метод, можно реализовать собственное. Я предположил бы, что это, вероятно, генерирует промежуточный список (когда необходимый), и выполняет итерации его наоборот, что-то как следующее:
public static IEnumerable<T> Reverse<T>(IEnumerable<T> items)
{
IList<T> list = items as IList<T>;
if (list == null) list = new List<T>(items);
for (int i = list.Count - 1; i >= 0; i-- )
{
yield return list[i];
}
}
Я соглашаюсь с @leppie, но думаю, что Вы заслуживаете ответа на вопрос в целом. Могло случиться так, что Вы имели в виду для вопроса быть в целом, но случайно выбрали структуру неправильных данных. Порядок значений в словаре нужно считать определенным для реализации; согласно документации это всегда - тот же порядок как ключи, но этот порядок является неуказанным также.
Так или иначе, нет простого способа сделать foreach
работа наоборот. Это - синтаксический сахар к использованию перечислителя класса, и перечислители могут только переместиться в одном направлении. Технически ответ мог быть "реверсом набор, затем перечислить", но я думаю, что это - случай, где необходимо будет просто использовать "назад" для цикла:
for (int i = myCollection.Length - 1; i >= 0; i--)
{
// do something
}
На самом деле в C# 2.0 можно создать собственный итератор, который пересекает контейнер наоборот. Затем можно использовать тот итератор в foreach операторе. Но Ваш итератор должен был бы иметь способ переместиться по контейнеру во-первых. Если это - простой массив, это могло бы пойти назад как это:
static IEnumerable<T> CreateReverseIterator<T>(IList<T> list)
{
int count = list.Count;
for (int i = count - 1; i >= 0; --i)
{
yield return list[i];
}
}
, Но конечно Вы не можете сделать этого со Словарем, поскольку он не реализует IList или обеспечивает индексатор. Высказывание, что Словарь не имеет порядка, не верно: конечно, это имеет порядок. Тот порядок может даже быть полезным, если Вы знаете, каково это.
Для решения Вашей проблемы: я сказал бы, копируют элементы в массив и используют вышеупомянутый метод для пересечения его наоборот. Как это:
static void Main(string[] args)
{
Dictionary<int, string> dict = new Dictionary<int, string>();
dict[1] = "value1";
dict[2] = "value2";
dict[3] = "value3";
foreach (KeyValuePair<int, string> item in dict)
{
Console.WriteLine("Key : {0}, Value: {1}", new object[] { item.Key, item.Value });
}
string[] values = new string[dict.Values.Count];
dict.Values.CopyTo(values, 0);
foreach (string value in CreateReverseIterator(values))
{
Console.WriteLine("Value: {0}", value);
}
}
Копирование Ваших значений к массиву может походить на плохую идею, но в зависимости от типа значения это не действительно настолько плохо. Вы могли бы просто копировать ссылки!
Если у Вас есть.NET 3.5, можно использовать.Reverse () дополнительный метод на IEnumerables. Например:
foeach (SomeObject o in myDictionary.Values.Reverse())
{
// Do stuff to object
}
Словарь или любая другая форма хеш-таблицы не имеют никакого упорядочивания. Таким образом, то, что Вы пытаетесь сделать, бессмысленно:)
Это было бы Dictionary<int, SomeObject> myDictionary
, и Вы сделаете это:
foreach(SomeObject _object in myDictionary.Values.Reverse())
{
}