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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по использованию IEnumerable 
V
    Опции темы
Kill_em_all
Дата 10.2.2014, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток. Сегодня был на собеседовании и гордо провалил техническое интервью. 
Задание, на котором я свалился: необходимо написать функцию, которая возвращает IEnumerable<int> без n последних элементов. Исходные данные - большая коллекция представленная IEnumerable<int>. Лишний раз проходить по списку нельзя, а по сему нельзя было использовать Count() и Reverse()

Возможно ли решить эту задачу с такими условиями? Я спросил интервьюера после: какое же решение? Но он невнятно что-то пробубнил про временный буффер, yield return и т.д, а допытываться я не стал и поверил на слово =)
PM MAIL   Вверх
jonie
Дата 10.2.2014, 18:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата(Kill_em_all @  10.2.2014,  16:59 Найти цитируемый пост)
без n последних элементов

быть может речь всеже шла про "без n или менее n последних элеменов" ?
т.к. с точным значеним n (без выделения памяти под весь массив (чтобы понять длину)) все будет мягко говоря сложновато...
а вот с моим условие просто:
Код

 static IEnumerable<T> LimitIEnumerable<T>(int n, IEnumerable<T> enumerable)
        {
            var buf = new T[n];
            var e = enumerable.GetEnumerator();
            while (true)
            {
                int i = 0;
                while (e.MoveNext())
                {
                    buf[i++] = e.Current;
                    if (i >= n) break;
                }
                if (i < n) yield break;

                foreach (var be in buf)
                {
                    yield return be;
                }
            }
        }


Это сообщение отредактировал(а) jonie - 10.2.2014, 18:46


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
infarch
Дата 10.2.2014, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот такая функция пришла в голову:
Код

        static IEnumerable<int> GetIE(IEnumerable<int> input, int n)
        {
            var ie=input.GetEnumerator();
            int[] buffer = new int[n];
            int ptr = 0;
            while (ptr < n && ie.MoveNext())
            {
                buffer[ptr++] = ie.Current;
            }
            int length = ptr;
            ptr--;
            while (ie.MoveNext())
            {
                int i = buffer[0];
                int[] tmp = new int[length];
                Array.Copy(buffer, 1, tmp, 0, ptr);
                buffer = tmp;
                buffer[ptr] = ie.Current;
                yield return i;
            }
        }


PM MAIL   Вверх
diadiavova
Дата 10.2.2014, 23:56 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

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



Да собственно проходишь коллекцию в цикле, первые n элементов просто добавляешь в очередь, дальше (начиная с n+1) при добавлении элемента в конец очереди, из начала извлекаешь элемент и йилдишь его. Таким образом йилд будет отставать от извлечения из входной коллекции как раз на n элементов. Когда во входной коллекции элементы закончатся, в очереди останутся n элементов неотйилденными, где и будут благополучно похоронены. Код писать лень, да в принципе он и так понятен.

ЗЫ
Честно говоря, без подсказки про буфер не догадался бы.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Kill_em_all
Дата 11.2.2014, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


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

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


 




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


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

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