none
Собственный массив string RRS feed

  • Общие обсуждения

  • Здравствуйте!

    Хочу сделать свою переменную-массив,делаю следующим образом:

    public class ArrayList
        {
            public ArrayList()
            { }
    
            public string[] Source { get; private set; }
            private static List<string> _lst = new List<string>();
    
            public void AdD(string item)
            {
                _lst.Add(item);
            }
            public string[] Finish()
            {
                Source = _lst.ToArray();
                return Source;
            }
            public string this[int key]
            {
                get { return _lst[key-1]; }
                //set { Source[key] = value; }
            }
           
        }
    
                ArrayList oi = new ArrayList();
                oi.AdD("qw");
                oi.AdD("qasdw");
                oi.AdD("qasdaw");
                oi.Finish();        
              
                Console.WriteLine(oi.Source[2]);

    Как сделать,чтобы массив Source начинался с индекса 1?

    P.S. List нужен для того,чтобы явно не указывать размер массива

    4 февраля 2014 г. 12:28

Все ответы

  • Напишите в свойстве Source такой же код, как в индексаторе.

    P.S. С помощью метода Array.CreateInstance можно создать массив, у которого нижняя граница может начинаться с любого значения.

    4 февраля 2014 г. 12:45
  • Не подскажите как в свойство Source добавить код?

    Через Array.CreateInstance вроде нельзя сделать массив без размера.

    4 февраля 2014 г. 13:56
  • Что такое массив без размера? Может быть вы имели в виду массив нулевой длинны? Если да, то элементарно:

    Array myArray = Array.CreateInstance(typeof(String), new int[] { 0 }, new int[] { 1 });

    Теперь про ваш вопрос. До тех пор, пока у вас тип возвращаемый свойство string[], индекс всегда будет с 0. Это C# и по другому в нем не будет. Либо доступ через индексатор (но тогда тип не string[]), либо через Array (но тогда тип опять не string[]).
    4 февраля 2014 г. 14:41
    Отвечающий
  • Если целью этой манипуляции является ускорение выборки по индексу,
    то выигрыш, конечно, весом - в полтора раза.
    Но уровень времен мизерен -
    выборка - у массива 10 нс, у листа - 15 нс на 1-у выборку,
    переприсвоение - у массива 18, у листа - 25 нс на 1-у выборку.
    Т.е., если Вам нужны миллиарды и миллиарды выборок и (или) переприсвоений, то смысл есть,
    а если миллионы или меньше - то усложнять нет смысла.





    • Изменено QazRdx 5 февраля 2014 г. 3:13
    4 февраля 2014 г. 23:45
  • Если целью этой манипуляции является ускорение выборки по индексу,
    то выигрыш, конечно, весом - в полтора раза.
    Но уровень времен мизерен -
    выборка - у массива 10 нс, у листа - 15 нс на 1-у выборку,
    переприсвоение - у массива 18, у листа - 25 нс на 1-у выборку.
    Т.е., если Вам нужны миллиарды и миллиарды выборок и (или) переприсвоений, то смысл есть,
    а если миллионы или меньше - то усложнять нет смысла.





    Подкиньте, пожалуйста, статьи на подобные тесты по .NET.
    5 февраля 2014 г. 12:57
  • Да здесь и статей никаких не надо,
    все легко тестируется.
    Понятно, что времена могут "гулять" 
    в зависимости от железа, загрузки и пр.
    Но соотношения примерно таковы.

    using System;
    using System.Linq;
    using System.Diagnostics;
    using System.Collections.Generic;
    public class Program
    {	static	void		Main	()
    	{	List<string>	Lst = new List<string>	{ "AAAAAAAAAA","B","C","D","E","F","G","H","I","J"};
    		Stopwatch	sw = new Stopwatch();
    		int K=10000000;
    		string S;
    		string [] Arr = Lst.ToArray();
     		for	(int j=0;j<10;j++)
    		{	sw.Restart();
    			for	(	int i=0;i<K;i++	)	{	Lst[5]="B";	}	//	{	S = Lst[5];		}
    			sw.Stop();	Console.WriteLine	(	"Lst - "+sw.ElapsedMilliseconds * 1000 * 1000 / K	);	//	25 ( нс );
    			sw.Restart();
    			for	(	int i=0;i<K;i++	)	{	Arr[5]="B";	}	//	{	S = Arr[5];		}
    			sw.Stop();	Console.WriteLine	(	"Arr - "+sw.ElapsedMilliseconds * 1000 * 1000 / K+"\n"	);	//	18 ( нс );
    			Console.WriteLine();
    		}	Console.ReadKey();
    }	}




    • Изменено QazRdx 5 февраля 2014 г. 14:42
    5 февраля 2014 г. 13:21
  • А, стопвотчами то понятно :)

    Учимся писать правильные C#-бенчмарки


    • Изменено Oleg Kurzov 5 февраля 2014 г. 13:34
    5 февраля 2014 г. 13:33