forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Перемещение по IList (http://forum.boolean.name/showthread.php?t=13055)

Miha 01.08.2010 10:47

Перемещение по IList
 
есть код на BlitzMax:
Код:

Global TCSGWorld_List:TList = New TList

Type TCSGWorld

    Method New()
   
    Add(TCSGWorld_List)
   
    End Method


    Method Add(t:TList)
        _list=t
        _link=_list.AddLast(Self)
    End Method
   
    Method Remove()
        _list.remove Self
       
    End Method
   
    Method Delete()
            _list.remove Self
            _link = Null
    End Method

    Method After:TCSGWorld()
        Local t:TLink
        t=_link.NextLink()
        If t Return TCSGWorld(t.Value())
    End Method

    Method Before:TCSGWorld()
        Local t:TLink
        t=_link.PrevLink()
        If t Return TCSGWorld(t.Value())
    End Method

    Method AddBrush(b:TCSGBrush)
    b.Add(Brush_list)
   
    End Method
   
    Method RebuildWorld(dynamic=False)
    Local b:TCSGBrush
    For b = EachIn Brush_list
    b.CSG(Self,False,dynamic)
    Next
   
    End Method
   

Field Brush_list:TList = New TList
Field id=CountList(TCSGWorld_List)
Field _list:TList
Field _link:TLink

End Type

Как мне реализовать это на C#?
Проблема в том что я не знаю как реализовать перемещение по _list (см. Method After:TCSGWorld(), Method Before:TCSGWorld()).
В BlitzMax для этого используется TLink, а C# х.з.
Поможите!
З.Ы. Если можно код плз.

pax 01.08.2010 11:37

Ответ: Перемещение по IList
 
В C# есть класс связанных списков:
LinkedList
на той же странице есть пример использования.
А посмотрев все его функции думаю ты найдешь все что нужно ;)
LinkedList - члены
Методы расширения смотреть если только используете Net Framework версии > 2.0

Miha 10.08.2010 10:21

Ответ: Перемещение по IList
 
Вообщем в двух словах!
Переписываю код с BlitzMax. Там видать какие-то коллизии с коллекциями.
Вот код:
Код:

public void CSG(TCSGWorld w, bool recursive = true, bool dynamic = false)
            {
                int mode = CSGFlag;

                int result, count;
                bool _protected;


               
                ResetBounds(w);
                CopyOriginal();

                foreach (TCSGBrush brush in Collist)
                {
                    if (brush != this)
                    {
                        foreach (TCSGSurface s in brush.Surface_List)
                        {
                            foreach (TCSGTriangle t in s.Original_List)
                            {
                                foreach (TCSGSurface s2 in this.Surface_List)
                                {
                                    foreach (TCSGTriangle t2 in s2.Triangle_List)
                                    {                                     
                                        if (t2.tarid != t.id)
                                        {
                                            if (t2.del == 0)
                                            {
                                                result = t2.ClassifyPolygon(t);
                                                switch (result)
                                                {
                                                    case CSG_SpliTCSGTriangle:
                                                        if (t2.Triangles_Collide(t) == true)
                                                        {
                                                            t2.Split_Triangle(t, s2.Triangle_List);
                                                        }
                                                        break;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }

                    Overwrite = false;

                    foreach (TCSGSurface s in Surface_List)
                    {
                        foreach (TCSGTriangle t in s.Triangle_List)
                        {
                            foreach (TCSGBrush brush1 in Collist)
                            {
                                if (brush1 == this)
                                {
                                    Overwrite = true;
                                    continue;
                                }

                                t.del = 1;
                                t.ClipBrush(brush1, CSGFlag, Overwrite);

                            }
                            Overwrite = false;
                            if (t.del == 1 && t._protected == false)
                            {
                                t.Remove();
                            }

                        }
                    }

                    if (recursive == true)
                    {
                        foreach (TCSGBrush brush2 in Collist)
                        {
                            if (brush2 != this)
                            {
                                brush2.CSG(w, false, dynamic);
                            }
                        }
                    }
                }
            }

Как только функция задействуется, вылетает исключение!
Collection was modified after the enumerator was instantiated

pax 10.08.2010 11:17

Ответ: Перемещение по IList
 
Могу угадать где вываливается такая ошибка:
PHP код:

if (t.del == && t._protected == false)
{
      
t.Remove();


В цикле foreach нельзя изменять коллекцию (удалять/добавлять/заменять элементы).

Miha 10.08.2010 11:59

Ответ: Перемещение по IList
 
А как мне удалить элемент коллекции?
Я так понимаю в коллекции располагаются объекты. Мне надо удалить объект в коллекции и и сам элемент коллекции (как бы индекс).

pax 10.08.2010 14:28

Ответ: Перемещение по IList
 
Для этого можно использовать цикл for или воспользоваться методом ForEach (ссылка) если ты пользуешься списком List<T>

Miha 10.08.2010 16:00

Ответ: Перемещение по IList
 
ок спс!
И еще вопрос не в тему:
Где мне найти наиболее полную и конкретную информацию по XNA?
О его возможностях.
Есть редактор свой, писал давно и хочу его модернезировать. И вот думаю перейти на XNA. Как считаешь?...

pax 10.08.2010 18:25

Ответ: Перемещение по IList
 
Цитата:

Сообщение от Miha (Сообщение 157874)
Как считаешь?...

Я? А я тут причем? Ты сам выбирай инструмент, который тебе подходит.
Справка по XNA здесь


Часовой пояс GMT +4, время: 22:06.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot