Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > foreach and for


Автор: Orseida 7.4.2008, 15:19
Всем привет! Извините за глупый вопрос. Я пока не сильна в программировании. Задача следующая: мне нужно, чтобы два цикла начинали выполняться одновременно. Логическая схема: для каждого элемента х из Х и для у=0; у<Y;y++ выполняется ......
Код:
Код


foreach( SPListItem Doc in collListItemPub) AND for( j=0;j<oListRub.Items.Count; j++)
{
................
};


Вопрос в следующем: что нужно написать вместо AND? && не подходит. Как это вообще оформить?

Спасибо за терпение.

Автор: teso 7.4.2008, 15:32
Может тебе нужно вложенный цикл делать?
Код

for(int i = 0;i<100;i++)
{
for(int j=0;j<100;j++)
{
................
}
}

Автор: Orseida 7.4.2008, 15:42
Нет, загвоздка как раз в том, что мне не нужно делать вложенный цикл. Если я делаю вложенный цикл, то для одного элемента верхнего цикла пробегаются все элементы вложенного, а мне это как раз и  не подходит.

Автор: vponomarov 7.4.2008, 15:49
Orseida, ну значит тебе нужно выполнить два цикла посследовательно.
если и это не подходит, то возможно стоит более детально объяснить задачу smile 

Автор: mr.DUDA 7.4.2008, 15:54
Так?
Код
int j = 0;
foreach(SPListItem Doc in collListItemPub)
{
     if (j >= oListRub.Items.Count) break;

     // тело цикла
     ...

     j++;
}


Добавлено через 2 минуты и 19 секунд
Можно и без форич, если у collListItemPub есть индексатор:
Код
for (int i = 0, j = 0; i < collListItemPub.Count && j < oListRub.Items.Count; i++, j++)
{
     SPListItem Doc = collListItemPub[i];

     ...
}

Автор: Orseida 7.4.2008, 15:59
Сейчас опробую. Спасибо.

Автор: Orseida 7.4.2008, 16:16
Гораздо лучше! smile
Еще раз спасибо!

Автор: sobik 7.4.2008, 16:39
Собственно, схожий вопрос: 
Есть некий ArrayList arlist, в котором сохраняються обьекты двух классов - MyClass1 i MyClass2. В первом определеy метод МуМethod1, во втором MyMethod2. Нужно вызвать для каждого обьекта в arliste один из этих двух методов, в зависимости от класса. Как это сделать проще всего? Возможно ли это сделать за 1 проход цикла?

Автор: mr.DUDA 7.4.2008, 17:13
sobik, в первом приближении будет так:

Код
foreach (object obj in myArrayList)
{
      if (obj is MyClass1)
      {
            MyClass1 obj1 = (MyClass1)obj;
            
            // ...
      }
      else if (obj is MyClass2)
      {
            MyClass2 obj2 = (MyClass2)obj;
            
            // ...
      }  
}

Автор: jonie 8.4.2008, 01:06
а можно сделать ооп-шнуто?
Код

interface IMethodEx
{
  public void ExecMethod();
}

class MyClass1Ex : IMethodEx, MуClass1
{
 public void ExecMethod()
 {
    this.Method1();
 }
}

class MyClass2Ex : IMethodEx, MуClass2
{
 public void ExecMethod()
 {
    this.Method2();
 }
}

foreach(IMethodEx m in myArrayList)
{
   m.ExecMethod();
}

?)
хотя на любителей)

Автор: mr.DUDA 8.4.2008, 10:39
jonie, т.к. ArrayList хранит object-ы, может отвалиться в строке 24 если попадётся объект не реализующий интерфейс. Тогда уже List<> лучше юзать.  smile 

Автор: Rififi 8.4.2008, 11:49
sobik, 
запихнуть разнородные обьекты в контейнер и потом пытаться с ними работать единообразно - обычно говорит о кривизне проектироаня, что в конечным итоге приводит к костылям, как в примере mr.DUDA
Почитай Гради Буча. или что-нибудь аналогичное для c#

Автор: vponomarov 8.4.2008, 13:06
Rififi, угу, и вообще лучше использовать строгую типизацию.
тогда таких проблем не будет.

Автор: sobik 8.4.2008, 16:33
2Rififi - как Вы посоветуете поступить в таком случае: 
У меня постоянно создаються обьекты разных типов на этапе создания програмы(например, их список записан в ХМЛ). Для каждого из них я должен вызвать соответствующий метод, в зависимости от типа.

Автор: mr.DUDA 8.4.2008, 17:45
sobik, есть возможность унаследовать от базового типа или хотя бы реализовать общий интерфейс? (как в примере jonie)

Автор: sobik 10.4.2008, 14:25
2mr.Duda:да, так можно сделать

Автор: archeg 10.4.2008, 15:02
sobik, если не секрет, что за типы?

В таких случаях нужно всегда стремиться к тому что посоветовал mr.DUDA. Ибо при добавлении нового типа в хмл (а я так понимаю, впринципе хмл как раз для того чтобы сделать добавление гибким) - вся гибкость пропадает. Прийдеться прописывать новый if в цикле  smile 

Если нужно разное количество аргументов, то можно что-то с рефлекшином придумать smile К примеру в хмл список аргументов - мы их считываем и через рефл. либо через object[] заганяем в метод .

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