В.NET C# 2.0, что простой способ состоит в том, чтобы сделать foreach наоборот?

После прочтения того, что вы написали 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 = "" и ко второму выводу.

16
задан Pandincus 17 September 2008 в 13:00
поделиться

13 ответов

Я использовал бы 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);

стоит отметить, что отсортированный список хранит пары ключ/значение, отсортированные по ключу только.

19
ответ дан 30 November 2019 в 15:07
поделиться

Литеральный ответ:

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
}
0
ответ дан 30 November 2019 в 15:07
поделиться

Можно использовать LINQ  to  Объекты Счетный. Реверс () функционирует в.NET 2,0 использования LinqBridge.

0
ответ дан 30 November 2019 в 15:07
поделиться

Стандарт for цикл был бы лучшим. Вы не должны волноваться об обработке наверху инвертирования набора.

0
ответ дан 30 November 2019 в 15:07
поделиться

Если Вы хотите набор типа словаря, но необходимо поддержать порядок вставки, можно изучить KeyedCollection здесь

, Это - слияние между словарем и списком. Тем путем можно получить доступ к элементам в наборе через ключ или индекс вставки.

единственный глюк - то, если Ваш элемент, сохраненный в наборе, должен иметь международный ключ. Если Вы могли бы изменить это на строку или другой тип (Гуид Mabye). Так как набор 1 будет искать ключ 1, а не индекс 1.

0
ответ дан 30 November 2019 в 15:07
поделиться

Единственным путем я могу придумать в .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
}
1
ответ дан 30 November 2019 в 15:07
поделиться

Если упорядочивание является самым важным, Вы могли Вы Стек и создавать простую структуру для хранения интервала, Объектной пары.

0
ответ дан 30 November 2019 в 15:07
поделиться

Если у Вас нет.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];
    }
}
3
ответ дан 30 November 2019 в 15:07
поделиться

Я соглашаюсь с @leppie, но думаю, что Вы заслуживаете ответа на вопрос в целом. Могло случиться так, что Вы имели в виду для вопроса быть в целом, но случайно выбрали структуру неправильных данных. Порядок значений в словаре нужно считать определенным для реализации; согласно документации это всегда - тот же порядок как ключи, но этот порядок является неуказанным также.

Так или иначе, нет простого способа сделать foreach работа наоборот. Это - синтаксический сахар к использованию перечислителя класса, и перечислители могут только переместиться в одном направлении. Технически ответ мог быть "реверсом набор, затем перечислить", но я думаю, что это - случай, где необходимо будет просто использовать "назад" для цикла:

for (int i = myCollection.Length - 1; i >= 0; i--)
{
    // do something
}
3
ответ дан 30 November 2019 в 15:07
поделиться

На самом деле в 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);
    }

}

Копирование Ваших значений к массиву может походить на плохую идею, но в зависимости от типа значения это не действительно настолько плохо. Вы могли бы просто копировать ссылки!

4
ответ дан 30 November 2019 в 15:07
поделиться

Если у Вас есть.NET 3.5, можно использовать.Reverse () дополнительный метод на IEnumerables. Например:

foeach (SomeObject o in myDictionary.Values.Reverse())
{
     // Do stuff to object
}
18
ответ дан 30 November 2019 в 15:07
поделиться

Словарь или любая другая форма хеш-таблицы не имеют никакого упорядочивания. Таким образом, то, что Вы пытаетесь сделать, бессмысленно:)

28
ответ дан 30 November 2019 в 15:07
поделиться

Это было бы Dictionary<int, SomeObject> myDictionary, и Вы сделаете это:

foreach(SomeObject _object in myDictionary.Values.Reverse())
{
}
1
ответ дан 30 November 2019 в 15:07
поделиться
Другие вопросы по тегам:

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