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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Коллекции 
V
    Опции темы
Dino99rus
Дата 11.2.2008, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Код

using System;
using System.Collections.Generic;
namespace bb
{
    public class A
    {
        private string s1;
        public string S1
        {
            get
            {
                return s1;
            }
        }
        private string s2;
        public string S2
        {
            get
            {
                return s2;
            }
        }
        public A(string s1, string s2)
        {
            this.s1 = s1;
            this.s2 = s2;
        }
        public override string ToString()
        {
            return s1 + " , " + s2;
        }
    }
    public class B
    {
        private List<A> rr;
        public B()
        {
            rr = new List<A>();
        }
        public List<A> R()
        {            
            rr.Add(new A("dfs", "fsd"));
            return rr;
        }
        public class C
        {
            public void rr()
            {
                Console.ReadLine();
                return;
            }
            public static void Main()
            {
                B _B = new B();
                List<A> rac = _B.R();
                rac.Add(new A("34", "43"));
                foreach (A r in rac)
                {
                    Console.WriteLine(r);
                    Console.WriteLine(r.S2);
                }
                Console.ReadLine();
            }
        }
    }
}


Суть задачи передать из одного класса массив объектов в другой. Меня интересует тот вариант который я использую оптимален или нет. Если нет то, какие вариант более подходят под эту задачу. В переменная s2 принимает всего три значения, а s1 любое. 

Это сообщение отредактировал(а) Dino99rus - 14.2.2008, 00:19
PM MAIL   Вверх
Ctrl
Дата 12.2.2008, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Доброго времени суток... 
 * "тот вариант который я использую оптимален или нет"  -  честно говоря, в твоем коде чего-то вразумительного для решения поставленной тобой задачи я так и не увидел.
Я тут написал немного кода - посмотри его, там есть несколько приемов работы с коллекциями (создание,работа через ICollection, копирование, обход элементов с выполнением обработки). Очень надеюсь, что поможет.

 * "В переменная s2 принимает всего три значения, а s1 любое." - попробуй использовать enum для первого случая (см.пример)

...И на будущее,старайся писать нормальный читабельный код,  не думай, что экономишь время называя переменные просто стуча пальцем по клаве...

Ну и пример:
Код

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

namespace CollectionTests {
    public abstract class CollectionSource<T> {
        public delegate void DoVisit(T element);
        ICollection<T> collectionCore = null;
        public CollectionSource() {
            this.collectionCore = CreateCollection();
        }
        public ICollection<T> Collection {
            get { return collectionCore; }
        }
        public void Add(T element) {
            Collection.Add(element);
        }
        public void CopyTo(CollectionSource<T> target) {
            if (target == null) return;
            foreach(T element in Collection){
                target.Collection.Add(element);
            }
        }
        public void Accept(DoVisit visit) {
            if (visit == null) return;
            foreach (T element in Collection) visit(element);
        }
        // TODO: implement other methods
        protected abstract ICollection<T> CreateCollection(); 
    }
    public class TestListSource<T> : CollectionSource<T> {
        protected override ICollection<T> CreateCollection() {
            return new List<T>();
        }
    }
    public enum ElementEnum { FirstValue, SecondValue, ThirdValue }
    public class Element {
        string firstPropCore;
        ElementEnum secondPropCore;
        public Element(string f, ElementEnum s) {
            this.firstPropCore = f;
            this.secondPropCore = s;
        }
        public string FirstProp {
            get { return firstPropCore; }
            set { firstPropCore = value; }
        }
        public ElementEnum SecondProp {
            get { return secondPropCore; }
            set { secondPropCore = value; }
        }
    }
    class Program {
        static void Main(string[] args) {
            // create collections
            TestListSource<Element> source = new TestListSource<Element>();
            TestListSource<Element> target = new TestListSource<Element>();
            // add some records
            source.Add(new Element("testElement00", ElementEnum.ThirdValue));
            source.Add(new Element("testElement01", ElementEnum.SecondValue));
            source.Add(new Element("testElement02", ElementEnum.FirstValue));
            // copy data from source to target
            source.CopyTo(target);
            // print content
            Console.WriteLine("Source Collection:");
            source.Accept(PrintElement);
            Console.WriteLine("Target Collection:");
            target.Accept(PrintElement);
        }
        static void PrintElement(Element e) {
            Console.WriteLine(e.FirstProp + "," + e.SecondProp.ToString());
        }
    }
}

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


Новичок



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

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



Суть задачи передать из одного класса массив объектов в другой.
Если цель только в этом то не лучше ли заюзать ArrayList
PM MAIL ICQ   Вверх
Dino99rus
Дата 13.2.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Цитата(Ctrl @  12.2.2008,  01:51 Найти цитируемый пост)
...И на будущее,старайся писать нормальный читабельный код,  не думай, что экономишь время называя переменные просто стуча пальцем по клаве...

Ну это пример.... Основной код да же с комментариями, но это не суть важно.

Цитата(Ctrl @  12.2.2008,  01:51 Найти цитируемый пост)
* "тот вариант который я использую оптимален или нет"  -  честно говоря, в твоем коде чего-то вразумительного для решения поставленной тобой задачи я так и не увидел.
Я тут написал немного кода - посмотри его, там есть несколько приемов работы с коллекциями (создание,работа через ICollection, копирование, обход элементов с выполнением обработки). Очень надеюсь, что поможет.

Спасибо, посмотре, но не понял в чем разница. Если не труду объясни.
PM MAIL   Вверх
Ctrl
Дата 13.2.2008, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Наверное я слишком усложнил смысл фразы "передать из одного класса массив объектов в другой".
и не стал думать просто про предачу ссылки на конкретную коллекцию или про копирование ArrayList-ов.
Просто иногда за словом "массив" могут скрываться довольно нетривиальные наборы объектов
(например, мне в последнее время часто приходится работать с коллекцией, которая на самом деле является 
иерархической структурой с двумя корнями), и вот тогда "оптимальность" измеряется именно удобством манипулирования содержимым этих наборов.
Обеспечивается это удобство именно "заворачиванием" в какойто класс, скрывающий детали.
Чем абстрактнее это заворачивание выглядит снаружи, тем лучше.
Простейший пример заворачивания приведен в моем куске кода:
Основные идеи, заложенные в пример с CollectionSource таковы: 
1. нет завязки на структуру коллекций (имплементим свой метод CreateCollection и используем List<>, ArrayList, базу данных, что угодно)
Код

    public class TestListSource<T> : CollectionSource<T> {
        protected override ICollection<T> CreateCollection() {
            return new List<T>();
        }
    }
    public class TestBindingListSource<T> : CollectionSource<T> {
        protected override ICollection<T> CreateCollection() {
            return new BindingList<T>();
        }
    }

2. удобно копировать содержимое между экземплярами CollectionSource
Код

            TestListSource<Element> source = new TestListSource<Element>();
            TestBindingListSource<Element> target = new TestBindingListSource<Element>();
            source.CopyTo(target);

3. удобно обрабатывать содержимое
Код

            TestListSource<int> intArray = new TestListSource<int>();
            intArray.Add(1);
            intArray.Add(2);
            intArray.Add(3);
            int sum = 0;
            intArray.Accept(delegate(int i) { sum += i; });
            Console.WriteLine("Element Summary: {0}",sum);


P.S. Извини за наезд насчет кода... резануло глаз просто
P.S.
... еще про оптимальность - современные программные продукты во главу угла ставят не скорость исполнения кода , 
а архитектурную гибкость, простоту поддержки и кастомного модифицирования.
Уважающие себя компании, предоставляющие
исходные коды немало ценят структурированность и читабельность кода, его тестовое покрытие
(комментариев кстати в хорошем коде фактически нет)

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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 10.1.2007

Репутация: 1
Всего: 2



Ctrl, 
Цитата(Ctrl @  13.2.2008,  23:20 Найти цитируемый пост)
... еще про оптимальность - современные программные продукты во главу угла ставят не скорость исполнения кода , 
а архитектурную гибкость, простоту поддержки и кастомного модифицирования.
Уважающие себя компании, предоставляющие
исходные коды немало ценят структурированность и читабельность кода, его тестовое покрытие
(комментариев кстати в хорошем коде фактически нет)

Большое спасибо. Ну я примерно такого ответа и ожидалsmile. Теперь мне все понятно.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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