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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой тип данных использовать? 
:(
    Опции темы
Elfet
  Дата 17.5.2007, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Мне нужен тип данных на подобии вот такого:
Код

Myclass  my
{
Myclass1 left,
Myclass1 right
}

И что бы был можно делать вот так: smile
Код

foreach(Myclass1 i in my)
{
//а тут i ссылается на left и right :)
}


// И вот так обращатся
my.left
my.right


Надеюсь понятно объяснил smile 


--------------------
PM MAIL WWW Skype   Вверх
adLucem
Дата 17.5.2007, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



Код

using System;
using System.Collections.Generic;
using System.Text;

namespace TestCS {

    public class MyClass1 {

        public MyClass1 ( string name ) {
            Name_ = name;
        }

        public string Name {
            get {
                return Name_;
            }
        }

        private string Name_;
    }

    public class MyClass : IEnumerable<MyClass1> {

        public MyClass1 Left {
            get {
                return Left_;
            }
            set {
                Left_ = value;
            }
        }

        public MyClass1 Right {
            get {
                return Right_;
            }
            set {
                Right_ = value;
            }
        }

        private MyClass1 Left_;
        private MyClass1 Right_;

        #region IEnumerable<MyClass1> Members

        public IEnumerator<MyClass1> GetEnumerator ( ) {
            return new MyClassEnumerator ( this );
        }

        #endregion

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ( ) {
            return new MyClassEnumerator ( this );
        }

        #endregion
    }

    public class MyClassEnumerator : IEnumerator<MyClass1> {

        public MyClassEnumerator ( MyClass container ) {
            Position_ = -1;
            Container_ = container;
        }

        #region IEnumerator<MyClass1> Members

        public MyClass1 Current {
            get {
                switch ( Position_ ) {
                    case 0:
                        return Container_.Left;
                    case 1:
                        return Container_.Right;
                    default:
                        throw new ArgumentOutOfRangeException ( );
                }
            }
        }

        #endregion

        #region IDisposable Members

        public void Dispose ( ) {
        }

        #endregion

        #region IEnumerator Members

        object System.Collections.IEnumerator.Current {
            get {
                return Current;
            }
        }

        public bool MoveNext ( ) {
            Position_++;
            return Position_ < 2;
        }

        public void Reset ( ) {
            Position_ = -1;
        }

        #endregion

        private int Position_;
        private MyClass Container_;
    }


    class Program {

        static void Main ( string [ ] args ) {
            MyClass my = new MyClass ( );
            my.Left = new MyClass1 ( "left" );
            my.Right = new MyClass1 ( "right" );
            foreach ( MyClass1 i in my ) {
                Console.WriteLine ( i.Name );
            }
            Console.WriteLine ( my.Left.Name );
            Console.WriteLine ( my.Right.Name );
        }
    }
}

PM MAIL ICQ   Вверх
Elfet
Дата 17.5.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Цитата(adLucem @  17.5.2007,  11:20 Найти цитируемый пост)
                switch ( Position_ ) {
                    case 0:
                        return Container_.Left;
                    case 1:
                        return Container_.Right;

Что то мне не охота так делать smile 
А если я буду использовать больше чем два класса? Какие-нибудь стандартные средства есть? smile


--------------------
PM MAIL WWW Skype   Вверх
adLucem
Дата 17.5.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



Цитата(Elfet @  17.5.2007,  08:36 Найти цитируемый пост)
Какие-нибудь стандартные средства есть?

Если имеются в виду стандартные средства динамического определения всех зависимостей конкретного класса без наличия сведений о нем на этапе компиляции, то конечно есть - Reflection.

Цитата(Elfet @  17.5.2007,  08:36 Найти цитируемый пост)
А если я буду использовать больше чем два класса

Напишите другой итератор.
PM MAIL ICQ   Вверх
Elfet
Дата 17.5.2007, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Reflection? smile


--------------------
PM MAIL WWW Skype   Вверх
adLucem
Дата 17.5.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 17.4.2007
Где: Украина, Донецк

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



Код

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace TestCS {

    public class MyClass1 {

        public MyClass1 ( string name ) {
            Name_ = name;
        }

        public string Name {
            get {
                return Name_;
            }
        }

        private string Name_;
    }

    public class MyClass : IEnumerable<MyClass1> {

        public MyClass1 Left {
            get {
                return Left_;
            }
            set {

                Left_ = value;
            }
        }

        public MyClass1 Right {
            get {
                return Right_;
            }
            set {
                Right_ = value;
            }
        }

        private MyClass1 Left_;
        private MyClass1 Right_;

        #region IEnumerable<MyClass1> Members

        public IEnumerator<MyClass1> GetEnumerator ( ) {
            return new MyClassEnumerator ( this );
        }

        #endregion

        #region IEnumerable Members

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ( ) {
            return new MyClassEnumerator ( this );
        }

        #endregion
    }

    public class MyClassEnumerator : IEnumerator<MyClass1> {

        public MyClassEnumerator ( MyClass container ) {
            Reset ( );
            Debug.Assert ( !ReferenceEquals ( container, null ) );
            Container_ = container;
            Type containerType = container.GetType ( );
            FieldInfo [ ] fields = containerType.GetFields (
                BindingFlags.NonPublic | BindingFlags.Instance );
            Fields_ = new List<FieldInfo> ( );
            foreach ( FieldInfo info in fields ) {
                if ( info.FieldType.Equals ( typeof ( MyClass1 ) ) ) {
                    Fields_.Add ( info );
                }
            }
        }

        #region IEnumerator<MyClass1> Members

        public MyClass1 Current {
            get {
                return Container_.GetType ( ).InvokeMember ( Fields_ [ Position_ ].Name,
                    BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance,
                    Type.DefaultBinder, Container_,
                    null ) as MyClass1;
                //switch ( Position_ ) {
                //    case 0:
                //        return Container_.Left;
                //    case 1:
                //        return Container_.Right;
                //    default:
                //        throw new ArgumentOutOfRangeException ( );
                //}
            }
        }

        #endregion

        #region IDisposable Members

        public void Dispose ( ) {
        }

        #endregion

        #region IEnumerator Members

        object System.Collections.IEnumerator.Current {
            get {
                return Current;
            }
        }

        public bool MoveNext ( ) {
            return ++Position_ < Fields_.Count;
        }

        public void Reset ( ) {
            Position_ = -1;
        }

        #endregion

        private int Position_;
        private MyClass Container_;
        private List<FieldInfo> Fields_;
    }


    class Program {

        static void Main ( string [ ] args ) {
            MyClass my = new MyClass ( );
            my.Left = new MyClass1 ( "left" );
            my.Right = new MyClass1 ( "right" );
            foreach ( MyClass1 i in my ) {
                Console.WriteLine ( i.Name );
            }
            Console.WriteLine ( my.Left.Name );
            Console.WriteLine ( my.Right.Name );
        }
    }
}

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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