Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > GetEnumerator и как с ним работать


Автор: Berserk 19.12.2006, 12:50
Есть listBox, я выделяю несколько Items и хочу вывести их(выделенные Items) в MessageBox, например. 

Вопрос в следующем smile :

Есть такая штуковина как GetEnumerator, она возвращает список выделенных Items, если я напишу listBox1.SelectedItems.GetEnumerator. Как мне теперь вывести Items из этого GetEnumerator. Возможно есть и другие способы реализации. Благодарен за любую помощь.
  

Автор: mr.DUDA 19.12.2006, 13:10
Можно foreach-ем их перечислить. Каждый айтем - это object, который можно перевести в строку ToString-ом.

Автор: ivashkanet 19.12.2006, 13:25
Berserk, судя по всему ты недавно в C#, так что GetEnumerator пока не трогай.

Поступаем так:
Код

            StringBuilder sb = new StringBuilder(10 * listBox1.SelectedItems.Count);

            foreach (object item in listBox1.SelectedItems)
            {
                sb.AppendLine(item.ToString());
            }

            MessageBox.Show(sb.ToString());

P.S. StringBuilder используется потому, что он создан именно для накапливания строки. Но вместо него можно было бы использовать обычный string, что снизило бы производительность, но для такого примера это не существенно.
Код

            String s = "";

            foreach (object item in listBox1.SelectedItems)
            {
                s += item.ToString() + "\n";
            }

            MessageBox.Show(s);

P.P.S. Если интересно, что такое Enumerator, то вот так им пользуется foreach
Код

            string s;
            IEnumerator enumerator = strings.GetEnumerator();
            enumerator.Reset();
            enumerator.MoveNext();
            while (enumerator.Current != null)
            {
                s = enumerator.Current;
                // DoSomething
                enumerator.MoveNext();
            }

который соответствует
Код

foreach(string s in stings)
{
// DoSomething
}

Автор: Wanderer2019 19.12.2006, 14:56
Цитата(ivashkanet @  19.12.2006,  13:25 Найти цитируемый пост)
         string s;
            IEnumerator enumerator = strings.GetEnumerator();
            enumerator.Reset();
            enumerator.MoveNext();
            while (enumerator.Current != null)
            {
                s = enumerator.Current;
                // DoSomething
                enumerator.MoveNext();
            }

я может конечно чего то не понимаю, но разве нельзя вот так:
Код

    string s;
            IEnumerator enumerator = strings.GetEnumerator();
            while (enumerator.MoveNext())
            {
                s = enumerator.Current;
                // DoSomething
            }

Автор: ivashkanet 19.12.2006, 15:07
Это писал я сам, так что могет быть неоптимально  smile 
Цитата(Wanderer2019 @  19.12.2006,  13:56 Найти цитируемый пост)
я может конечно чего то не понимаю, но разве нельзя вот так:

Можно. И будет то же самое  smile 

Я когда это писал --- очень сильно перестраховывался  smile 

Автор: ivashkanet 19.12.2006, 15:51
Прикол, в MSDN пример про Enumerator выглядит так:
Код

      int i = 0;
      System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
      Console.WriteLine( "The Array contains the following values:" );

      while (( myEnumerator.MoveNext() ) && ( myEnumerator.Current != null ))
         Console.WriteLine( "[{0}] {1}", i++, myEnumerator.Current );

т.е. они еще проверяют текущий на null (может это просто перестраховка  smile )

Автор: Berserk 19.12.2006, 15:53
to ivashkanet  С С# я познакомился бувально неделю назад. Огромное спасибо за примеры

Спасибо всем кто не остался равнодушным.  smile 

Автор: Wanderer2019 19.12.2006, 15:57
Цитата(ivashkanet @  19.12.2006,  15:51 Найти цитируемый пост)
т.е. они еще проверяют текущий на null (может это просто перестраховка  smile )

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

 smile 
ivashkanet, млин вас не поймешь! думал Дрон пишет =) чего все аватары перекинули то?

Автор: ivashkanet 19.12.2006, 16:00
Цитата(Wanderer2019 @  19.12.2006,  14:57 Найти цитируемый пост)
ну думаю скорей всего это не перестраховка, а проверка на значние... т.е. по сути примера некоторые объекты могут иметь значение null и тогда выводить их не нужно. Если же уверен, что каждый объект не null, то можно этого не писать.

Это я и имел ввиду под перестраховкой  smile 

Вот полный пример:
Код

 public static void Main()  {
 
      // Creates and initializes a new Array.
      String[] myArr = new String[10];
      myArr[0] = "The";
      myArr[1] = "quick";
      myArr[2] = "brown";
      myArr[3] = "fox";
      myArr[4] = "jumped";
      myArr[5] = "over";
      myArr[6] = "the";
      myArr[7] = "lazy";
      myArr[8] = "dog";
 
      // Displays the values of the Array.
      int i = 0;
      System.Collections.IEnumerator myEnumerator = myArr.GetEnumerator();
      Console.WriteLine( "The Array contains the following values:" );
      while (( myEnumerator.MoveNext() ) && ( myEnumerator.Current != null ))
         Console.WriteLine( "[{0}] {1}", i++, myEnumerator.Current );

   }

Неужели можно подумать, что какой-то из элементов будет null  smile 

Автор: Wanderer2019 19.12.2006, 16:01
Цитата(ivashkanet @  19.12.2006,  16:00 Найти цитируемый пост)
Неужели можно подумать, что какой-то из элементов будет null  smile  

MiCrOsOfT  smile 

Автор: ivashkanet 19.12.2006, 16:39
Цитата(Berserk @  19.12.2006,  14:53 Найти цитируемый пост)
Огромное спасибо

Заходите еще

 smile 
Цитата(Wanderer2019 @  19.12.2006,  14:57 Найти цитируемый пост)
ivashkanet, млин вас не поймешь! думал Дрон пишет =) чего все аватары перекинули то?

 smile  smile  smile 
http://forum.vingrad.ru/index.php?showtopic=127401&hl=

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)