Фрагменты кода Visual Studio — как указать коллекцию цикла foreach

При использовании ярлыка/фрагментов Visual Studio можно ли указать коллекцию заранее/автоматически, а не заполнять зеленые поля впоследствии?

В этом случае я пытаюсь придумать что-то вроде следующего с наименьшим количеством нажатий клавиш:

foreach (ListItem item in ListBox1.Items)
{
    //
}

Например, сочетание клавиш «CTRL+K, CTRL+X foreach» предполагает, какую коллекцию я хочу перебрать, и обычно ошибается. Я часто заканчиваю следующим:

foreach (object var in collection_to_loop)
{
        //
}

Если я ввожу идентификатор коллекции и/или использую «Surround with», это не работает лучше, поскольку он помещает выделенный элемент в блок цикла следующим образом:

foreach (ListItem item in ListBox1.Items)
{
    ListBox1.Items 
}

Есть ли способ сделать это? Я использую Visual Studio 2005, но был бы рад узнать, что это можно сделать в 2008 или с помощью плагина.


РЕДАКТИРОВАТЬ: Хорошо, кажется, я не только не объяснил четко, что мне нужно, я видел функцию Resharper и думал, что это встроенная функция VS. Оказывается, это «Живые шаблоны» Resharper, которые энергично пытаются угадать, какой тип коллекции поместить в цикл, и примерно в 1/4 случаев делают это правильно.

Что мне было нужно, так это небольшое понимание того, как Resharper делает это предположение, и что я могу сделать (например, выделить идентификатор моей желаемой коллекции), чтобы дать ему подсказку. Я посмотрю на веб-сайте Jetbrains и обновлю здесь, если что-нибудь найду.


person Andrew M    schedule 24.05.2009    source источник
comment
Обречены изучать синтаксис кода и печатать? Вы хотите сэкономить, сколько здесь нажатий клавиш? Честно говоря, я думаю, что программирование может показаться вам не совсем вашим занятием.   -  person DOK    schedule 24.05.2009
comment
‹вздох› Я думал, что было бы неплохо попытаться изучить приемы и функции IDE. Спасибо за поддержку.   -  person Andrew M    schedule 25.05.2009


Ответы (2)


Введите «ListBox1.Items», используя обычный intellisense, затем нажмите Alt-Enter и выберите «Перечислить коллекцию с помощью foreach» (не точный текст).

Однако, если говорить именно о ListBox.Items (из Windows.Forms), то это тип ObjectCollection, который не является строго типизированным. Таким образом, почти невозможно угадать правильный тип элементов. Для WPF свойство Items также возвращает не строго типизированную коллекцию ItemCollection. Если у вас есть строго типизированная или универсальная коллекция, ReSharper может правильно определить тип элемента перечисления.

person Ilya Ryzhenkov    schedule 26.05.2009
comment
Илья, спасибо, идеально. Вы правы в том, что это не строго типизировано, я должен был немного обобщить свой пример, но даже в этом случае ваш ярлык более полезен, чем эквивалентный фрагмент. С тех пор я играл с другими коллекциями строгого типа, и я постараюсь запомнить эту. - person Andrew M; 27.05.2009

Я действительно не совсем знаю, как это сказать, но вы думаете, что, может быть, вы просите слишком много автоматизации? Я имею в виду, что фрагменты кода хороши, потому что они сокращают повторяющийся набор текста. Но теперь вы хотите, чтобы он действительно угадал, что вы собирались напечатать в любом случае. Должен ли он также угадывать тело цикла?

Вы можете изучить CodeRush с помощью Developer Express, который имеет гораздо более мощную функцию генерации кода, но я не уверен, что он может сделать то, что вы предлагаете.

person Josh    schedule 24.05.2009
comment
Хорошо, может быть, я многого прошу :), но я совершенно не хочу, чтобы об этом догадывались, я хочу иметь возможность рассказать об этом заранее. IE, если я выделю какой-нибудь объект IEnumerable, а затем сделаю ярлык, я бы хотел, чтобы он использовал этот объект в foreach. Кажется более логичным, чем текущее поведение. - person Andrew M; 25.05.2009