asp.net: итерация по нескольким коллекциям repeater.items - PullRequest
7 голосов
/ 01 апреля 2011

У меня есть несколько одинаковых повторителей, и мне нужно пройтись по всем пунктам. В настоящее время у меня есть:

 For Each item In rpt1.Items
    ...do some stuff
 Next

 For Each item In rpt2.Items
    ...exact same code
 Next

Есть ли простой способ сократить это до одного цикла For Each ... Next?

Редактировать: Есть несколько локальных переменных, участвующих в "делать некоторые вещи", поэтому я не могу просто передать элемент в функцию - вызов должен включать около 8 параметров ByRef.

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Просто поместите ваш код в отдельный метод:

For Each item In rpt1.Items
    DoSomethingWith(item)
Next
For Each item In rpt2.Items
    DoSomethingWith(item)
Next 

...

Sub DoSomethingWith(item As RepeaterItem)
   ... put your common code here ...
End Sub

РЕДАКТИРОВАТЬ : Если у вас много локальных переменных, можно использовать локальную лямбду:

Dim doSomething = Sub(item As RepeaterItem)
                      ... do some stuff using all available local variables
                  End Sub

For Each item In rpt1.Items
    doSomething(item)
Next
For Each item In rpt2.Items
    doSomething(item)
Next 

РЕДАКТИРОВАТЬ : еще один параметр, который не требует лямбда-выражений:

For Each rpt In New Repeater() {rpt1, rpt2}
    For Each item In rpt.Items
        ...do something with item and rpt
   Next
Next
1 голос
/ 01 апреля 2011

Это C #, но он проверит все элементы управления и дочерние элементы управления для элементов управления повторителя, а затем сделает все, что вам нужно.

Назовите это так:

DoSomethingWithMyRepeaterControls(Form.Controls);

Метод:

private static void DoSomethingWithMyRepeaterControls(ControlCollection controls)
        {
            foreach (Control control in controls)
            {
                if(control.HasControls())
                    DoSomethingWithMyRepeaterControls(control.Controls);

                if(control.GetType() == typeof(Repeater))
                {
                    //here there be tygers   
                }
            }
        }
1 голос
/ 01 апреля 2011

В C # я бы сделал что-то подобное в LINQ, но не уверен, что вы можете преобразовать это в VB.

var rep1 = new Repeater();
var rep2 = new Repeater();
var rep3 = new Repeater();

foreach (var item in rep1.Items.OfType<ListItem>()
    .Concat(rep2.Items.OfType<ListItem>())
    .Concat(rep3.Items.OfType<ListItem>()))
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...