Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перебор элементов SortedDictionary, Нельзя изменять значения в цикле foreach 
:(
    Опции темы
Slash_from_Rjazan
Дата 30.1.2010, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.5.2007

Репутация: нет
Всего: нет



Обнаружил что вот в таком цикле
Код


SortedDictionary<string, int> Rows = new SortedDictionary<string, int>();

// ... добавление элементов в коллерцию ...

// далее нужно все элементы обработать
foreach(string xKey in Rows.Keys){
 Rows[xKey] = ...
}



Выдается исклчение типа "Коллекция была изменена после создания итератора", что в общем-то не очень логично т.е. коллекцию Rows.Keys я не изменяю...

Вопрос собственно в том, как перебрать все элементы SortedDictionary с возможностью модификации.

Пока придумал вот такой способ, но он вызывает у меня чувство избыточности:

Код


string[] xKeysArray = Rows.Keys.ToArray();
foreach (string xKey in xKeysArray)
{
  Rows[xKey] = ...
}




Это сообщение отредактировал(а) Slash_from_Rjazan - 30.1.2010, 11:37
PM MAIL   Вверх
kobra
Дата 31.1.2010, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 730
Регистрация: 15.6.2005
Где: Грузия, Тбилиси

Репутация: 1
Всего: 9



ползовать for или while.
и почитать про foreach smile
PM MAIL   Вверх
Slash_from_Rjazan
Дата 31.1.2010, 01:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 11.5.2007

Репутация: нет
Всего: нет



Цитата(kobra @ 31.1.2010,  01:02)
1. ползовать for или while.
2. и почитать про foreach smile

1. Как с помощью for или while перебрать элементы SortedDictionary<string,int>?
2. Прочитал... Поделитесь, пожалуйста, какое откровение должно было мне открыться касательно моего вопроса.
PM MAIL   Вверх
Ceiceron
Дата 31.1.2010, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 2.8.2007
Где: Дубна

Репутация: нет
Всего: нет



На самом деле странно менять значения в отсортированной коллекции, являющейся деревом. 
Сначала внимательно читаем вот эту статью. foreach для изменения значений такой коллекции использовать нельзя.
Но если уж очень хочется, то я бы создал нечто вроде вот таких классов:
Код

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args) {
            //SortedDictionary<string, int> sort = new SortedDictionary<string, int>();
            SortedCollection sort = new SortedCollection();
            sort.Add("s",1);
            sort.Add("a", 2);
            sort.Add("g", 3);

            foreach (SortPair item in sort) {
                item.Value = 0; //тут все без проблем
            }            
        }
    }

    public class SortPair:IComparable
    {
        public SortPair(string key,int val) {
            Key = key;
            Value = val;
        }

        public string Key { get; set; }

        public int Value { get; set; }

        public override bool Equals(object obj) {
            return Equals(obj as SortPair);
        }

        public bool Equals(SortPair pair) {
            return pair.Key.Equals(Key);
        }

        public override string ToString() {
            return Key + " " + Value.ToString();
        }

        public override int GetHashCode() {
            return Key.GetHashCode() ^ Value.GetHashCode();
        }

        #region IComparable Members

        public int CompareTo(object obj) {
            if (!(obj is SortPair)) throw new ArgumentException("object is not a SortPair");
            SortPair pair =(SortPair) obj;
            return Key.CompareTo(pair.Key);
        }

        #endregion
    }

    public class SortedCollection : List<SortPair>
    {
        public void Add(string key, int value) {
            SortPair pair = new SortPair(key, value);
            Add(pair);
            Sort();
        }
    }
}


P.S. за производительность не отвечаю, но работать должно без проблем.
PM MAIL   Вверх
ДобренькийПапаша
Дата 31.1.2010, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 14.1.2006
Где: г.Москва

Репутация: нет
Всего: 7



Slash_from_Rjazan, а Вам не подходит воспользоваться обычным Dictionary<string, int>, написав для него функцию Sort()?


--------------------
Меня зовут Себастьян Парейра, торговец чёрным деревом.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0429 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.