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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зачем нужен IEnumerable<T> ? 
:(
    Опции темы
0leg
Дата 5.12.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В каких случаях целесообразно использовать IEnumerable<T> и чем он лучше простого IEnumerable ?
Сначала думал можно будет в foreach типы выбираемых значений контролировать, оказалось - нет.

В MSDN есть пример стека с использованием IEnumerable<T>, но по-моему его легко и простым IEnumerable реализовать.

Ошибка Микрософта?
PM MAIL   Вверх
ivashkanet
Дата 5.12.2006, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



0leg, любую логику можно реализовать без использования дженериков. Первый FW тому явное подтверждение.
Но согласишься ли ты использовать ArrayList вместо List<T>? Врядли.

Энумераторы используются не только в foreach. Ты ведь его сам можешь использовать, а в таком случае удобнее получать реальный тип T, а не объект  smile 
Цитата(0leg @  5.12.2006,  09:59 Найти цитируемый пост)
foreach

foreach возвращает объект только потому что он так закодирован. И изменить его нельзя

Это сообщение отредактировал(а) ivashkanet - 5.12.2006, 11:15
PM MAIL WWW ICQ   Вверх
0leg
Дата 5.12.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ivashkanet @  5.12.2006,  11:14 Найти цитируемый пост)
foreach возвращает объект только потому что он так закодирован. И изменить его нельзя

IEnumerable<T> наследует IEnumerable вместе с его методом GetEnumerator(). Я думал он используется при несовпадении выбираемого типа с типом T, поэтому foreach типы и неконтролирует.


Цитата(ivashkanet @  5.12.2006,  11:14 Найти цитируемый пост)
 Ты ведь его сам можешь использовать, а в таком случае удобнее получать реальный тип T, а не объект  

понял
PM MAIL   Вверх
ivashkanet
Дата 5.12.2006, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(0leg @  5.12.2006,  10:40 Найти цитируемый пост)
понял 

 smile 
P.S. И вообще, по forech --- он же использует нормальные типы:

Код

foreach(string s in stings)
{
// тут мы имеем живой стринг, а не объект, который был получен от enumerator.Current
}

PM MAIL WWW ICQ   Вверх
0leg
Дата 5.12.2006, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ivashkanet @  5.12.2006,  12:00 Найти цитируемый пост)
P.S. И вообще, по forech --- он же использует нормальные типы

ага, напрягает только вот это:
Код

foreach(Button s in strings)
{
// замечательно компилируемый код
}


PM MAIL   Вверх
ivashkanet
Дата 5.12.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(0leg @  5.12.2006,  11:59 Найти цитируемый пост)
Button s in strings

Ну такое нужно еще умудриться написать  smile 

А что ты предлагаешь?

Код

foreach(object o in strings)
{
s = (string) o;
// ...
}


или может 
Код

foreach<T>(T t in strings)
{
// ...
}

 smile 


foreach это просто удобная обертка к
Код

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

                // DoSomething

                enumerator.MoveNext();
            }

Что можно здесь изменить, чтобы foreach стал безопасен к типам?  smile 
PM MAIL WWW ICQ   Вверх
0leg
Дата 5.12.2006, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(ivashkanet @  5.12.2006,  13:20 Найти цитируемый пост)
Что можно здесь изменить, чтобы foreach стал безопасен к типам?  

Если strings реализует IEnumerable<string>, то Current возвращает кокретный тип string и твой пример не скомпилится, в отличие от  foreach.
Код

Button s;
IEnumerator enumerator = strings.GetEnumerator();
enumerator.Reset();
enumerator.MoveNext();
while (enumerator.Current != null)
{
  s = enumerator.Current;// ошибка

  // DoSomething

  enumerator.MoveNext();
}

PM MAIL   Вверх
ivashkanet
Дата 5.12.2006, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



0leg, не хочу спорить, но иди почитай матчасть про наследование и полиморфизм

Если бы у меня было 
Код
IEnumerator<string> enumerator = strings.GetEnumerator();

То все было бы именно так, как ты сказал.
PM MAIL WWW ICQ   Вверх
0leg
Дата 5.12.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



smile виноват
тогда принудительную проверку типов можно было сделать

ладно, не мне туда лезть...

Итог:

Применять IEnumerable<T> только для foreach не стоит.

Это мне и надо было. Спасибо.
PM MAIL   Вверх
ivashkanet
Дата 5.12.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Цитата(0leg @  5.12.2006,  13:18 Найти цитируемый пост)
тогда принудительную проверку типов можно было сделать

Цитата(ivashkanet @  5.12.2006,  12:20 Найти цитируемый пост)
Что можно здесь изменить, чтобы foreach стал безопасен к типам?

Так чтобы не изменять синтаксиса:
Код

foreach (Кто-то в чем-то)
{
}

PM MAIL WWW ICQ   Вверх
Дрон
Дата 5.12.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

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



Цитата(ivashkanet @  5.12.2006,  13:20 Найти цитируемый пост)
foreach<T>(T t in strings)
{
// ...
}

А нечто подобное уже есть smile
Метод класса Array.
Код
public static void ForEach<T> (
    T[] array,
    Action<T> action
)


Используется, например, так:
Код

string[] strings;
Array.ForEach<string>(strings, delegate(string str)
   {
      /* ну и тут делаем что-нибудь */
   });



Это сообщение отредактировал(а) Дрон - 5.12.2006, 17:33


--------------------
Да. Именно так.
PM   Вверх
ivashkanet
Дата 5.12.2006, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

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



Дрон, ага. Классный метод. Только им не особо пользуются.
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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