Я новичок в C# да и вообще в языках линейки C
Вопрос следуюший, можно ли создавать ассоциативные массивы — т.е. где
индексом выступает не число а слово.
Можно ли создавать смешанные массивы — т.е. много мерный массив, где первый
индекс — числовой а второй ассоциативный или наоборот.
И к примеру така я ситуация что есть много мерный масси, а данные в нем
смешанного типа, т.е. могут быть как и числого формата(int) так и
тестового(string). Как здесь быть, потому что если мы создаем массив то уже
срзу задаем ему тип, или выхода нет?
Здравствуйте, ivan23i, Вы писали:
I>Вопрос следуюший, можно ли создавать ассоциативные массивы — т.е. где I>индексом выступает не число а слово.
Hashtable
I>Можно ли создавать смешанные массивы — т.е. много мерный массив, где первый I>индекс — числовой а второй ассоциативный или наоборот.
Hashtable[]
I>И к примеру така я ситуация что есть много мерный масси, а данные в нем I>смешанного типа, т.е. могут быть как и числого формата(int) так и I>тестового(string). Как здесь быть, потому что если мы создаем массив то уже I>срзу задаем ему тип, или выхода нет?
А можно о Hashtable[] и о object[] с примером?
"AndrewVK" <forum@rsdn.ru> сообщил/сообщила в новостях следующее: news:362652@news.rsdn.ru...
From: AndrewVK модератор
Здравствуйте, ivan23i, Вы писали:
I>Вопрос следуюший, можно ли создавать ассоциативные массивы — т.е. где I>индексом выступает не число а слово.
Hashtable
I>Можно ли создавать смешанные массивы — т.е. много мерный массив, где первый I>индекс — числовой а второй ассоциативный или наоборот.
Hashtable[]
I>И к примеру така я ситуация что есть много мерный масси, а данные в нем I>смешанного типа, т.е. могут быть как и числого формата(int) так и I>тестового(string). Как здесь быть, потому что если мы создаем массив то уже I>срзу задаем ему тип, или выхода нет?
Hashtable предназначен для хранения ассоциативных данных, пар ключ-значение. Ключ и значение могут иметь любой тип. Ключ должен быть уникален. Пускай ключ будет строкой
Если тебе нужно чтобы старший индекс был числом то создаешь массив хеш-таблиц. Тогда выборка значения будет примерно такой:
Hashtable[] data = new Hashtable[3];
...
object val = data[2]["key"];
Если наоборот то в хештаблице храни массивы
Hashtable ht = new Hashtable();
ht.Add("key", new object[3]);
...
object val = ((object)ht["key"])[2];
Чтобы избавиться от приведения типов можно отнаследоваться от DictionaryBase и написать тпизированную хеш-таблицу.
Ну и еще один вариант — на основе набора индексов создавать комбинированный ключ, например "1|two|25.07.99" и хранить значение в единственной хеш-таблице. Для доступав по индексу придется написать свою обертку, генерирующую такой ключ.
Хм, не знаю насчте халявшиком.
В MSDN смотре нашел только как делать одномерные массивы, вот и спрасил про многмерные, с одномерными то все просто.
Но все равно спасибо
"AndrewVK" <forum@rsdn.ru> сообщил/сообщила в новостях следующее: news:362733@news.rsdn.ru...
From: AndrewVK модератор
Здравствуйте, ivan23i, Вы писали:
I>А можно о Hashtable[] и о object[] с примером?
Ну блин халавщики, даже MSDN не ситают .
object[] годится для хранения разнородных данных. Фокус в том что любой тип в дотнете приводится к object.
Hashtable предназначен для хранения ассоциативных данных, пар ключ-значение. Ключ и значение могут иметь любой тип. Ключ должен быть уникален. Пускай ключ будет строкой
Если тебе нужно чтобы старший индекс был числом то создаешь массив хеш-таблиц. Тогда выборка значения будет примерно такой:
Hashtable[] data = new Hashtable[3];
...
object val = data[2]["key"];
Если наоборот то в хештаблице храни массивы
Hashtable ht = new Hashtable();
ht.Add("key", new object[3]);
...
object val = ((object)ht["key"])[2];
Чтобы избавиться от приведения типов можно отнаследоваться от DictionaryBase и написать тпизированную хеш-таблицу.
Ну и еще один вариант — на основе набора индексов создавать комбинированный ключ, например "1|two|25.07.99" и хранить значение в единственной хеш-таблице. Для доступав по индексу придется написать свою обертку, генерирующую такой ключ.
... << RSDN@Home 1.1 beta 1 (np: тихо) >>
Оценить
Здравствуйте, ivan23i, Вы писали:
I>В MSDN смотре нашел только как делать одномерные массивы, вот и спрасил про многмерные, с одномерными то все просто.
В Шарпе есть понятие массив массивов, а есть многомерный массив. Точ то ты спрашивал (про ассоциативные массивы) вообще к языку не оносится. А то, что тебе показывал АВК — это как раз массивы одномерные (временами вложенные).
PS
И, пожалуйста, не оверквоть так сильно.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
ХМ, разве масисв массивов не одно и тоже что и много мерный массив? Стуктура то таже.
А убивать никого не надо, все мы учимся.
"VladD2" <forum@rsdn.ru> сообщил/сообщила в новостях следующее: news:362814@news.rsdn.ru...
From: VladD2 rsdn www.optim.ru/cs
Здравствуйте, ivan23i, Вы писали:
I>В MSDN смотре нашел только как делать одномерные массивы, вот и спрасил про многмерные, с одномерными то все просто.
В Шарпе есть понятие массив массивов, а есть многомерный массив. Точ то ты спрашивал (про ассоциативные массивы) вообще к языку не оносится. А то, что тебе показывал АВК — это как раз массивы одномерные (временами вложенные).
PS
И, пожалуйста, не оверквоть так сильно.
... << RSDN@Home 1.1 beta 1 >>
Оценить
Лучше бы просто обяснили понятным языком новичку, просто все то оно конечно хорошо, но пока языком пару месяцев не попользуешся почти любое руковдство или короткие ответы не помогут по причине не хватки знаний.
Здравствуйте, ivan23i, Вы писали:
I>Лучше бы просто обяснили понятным языком новичку, просто все то оно конечно хорошо, но пока языком пару месяцев не попользуешся почти любое руковдство или короткие ответы не помогут по причине не хватки знаний.
Ну, не знаю я с С++ и Дельфи за пять минут перелез. Конечно тонкости есть везде, но хэш-таблицы они и в африке хэш-таблицы (правда в Дельфи они появились только в шестерке).
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ivan23i, Вы писали:
I>ХМ, разве масисв массивов не одно и тоже что и много мерный массив?
Да. Это разные вещи. Вот смотри:
// Массива массивов интов. Инициализируется пустым массивом.int[][] aryOfAryOfInt = new int[3][];
// А вот это уже многомерный массивint[,][] aryIntMatrix = new int[3,3];
// А вот разница
aryOfAryOfInt[0] = new int[2];
aryOfAryOfInt[1] = new int[1000];
aryOfAryOfInt[2] = null;
aryOfAryOfInt[0][1] = 123;
aryIntMatrix[0,1] = 123;
I>Стуктура то таже.
Нет. Как видишь массивы массивов гибче. К тому же с обычными массивами (в том числе и вложенными) дотнет работает командами MSIL-а которые переводятся непосредственно в команды процессора, а с многомерными работа идет через функции (не видимо для программиста). Это замедляет код.
PS
И еще раз говорю. Грохай все цитаты которые не нужны для понимания контекста вопроса/ответа.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ivan23i, Вы писали:
I>Вопрос следуюший, можно ли создавать ассоциативные массивы — т.е. где I>индексом выступает не число а слово. I>Можно ли создавать смешанные массивы — т.е. много мерный массив, где первый I>индекс — числовой а второй ассоциативный или наоборот.
Пример:
using System;
using System.Collections;
namespace ArrayEx
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Hashtable[] hash;
hash=new Hashtable[3];
hash[0]=new Hashtable();
hash[0].Add("First",23);
Console.WriteLine(hash[0]["First"]);
}
}
}
Ая прогал только на php+Jscript и там нету хеш таблиц. И работа с массивами элементарнее. ни надо ни размерность ни тим указывать, что хочешь то и твориш, поэтому для меня ново, вот и спрашиваю.
Здравствуйте, ivan23i, Вы писали:
I>Ая прогал только на php+Jscript и там нету хеш таблиц. И работа с массивами элементарнее. ни надо ни размерность ни тим указывать, что хочешь то и твориш, поэтому для меня ново, вот и спрашиваю.
Размерность для массивов — всегда надо указывать! Ах, как было бы хорошо не указывать размер . Но "безразмерные" массивы всё же — существуют — это ArrayList.
Здравствуйте, ivan23i, Вы писали:
I>Ая прогал только на php+Jscript и там нету хеш таблиц. И работа с массивами элементарнее. ни надо ни размерность ни тим указывать, что хочешь то и твориш, поэтому для меня ново, вот и спрашиваю.
Это скриптовые языки. У них свои особенности. Они очень ограничены и многое им не дано. Но и там, и там есть библиотеки расширения и хэш-таблицы среди них точно имеются.
Вооще, я бы посоветова прочесть какую-нибудь толковую книку по программированию на компилируюемых языках. Раз уж выбрал Шарп, то лучше на нем. И еще очень полезно прочесть книгу по алгоритмам и структурам данных, ну, или на худой конец статью на которую я указывал.
Главное же нужно запомнить, что основное различие между компилируемыми языками и скриптовыми в том, что в сам язык обычно встроен минимальный набор самых необходимых действий. Все остальное в библиотеках. Ну, и нужно привыкнуть к тому, что все теперь типизировано и для решения проблем нужно искать (или писать свой) класс.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Хеш-таблиц там точно нет, если бы были то я бы думаю что сталкивался.
Статью прочту обязательно.
А что касаемо книги, купил себе C# и платформа .Net Эндрю Троелсена — r сожелению не все подробно расписано. Поэтому что не понятно то и спрашиваю. Я думаю не смертельно же если человеку что-то не понятно. помоему это хорошо что есть вопросы — значит он думает.
Если не сложно посовеетуй книжку по алгоритмам и структурам данных.
Ну а ктому что все типизированно. начинаю привыкать. Не знаю просто мне почему т понравился C#, да и для разработки КИС он помоему самое подходящее решение!
Здравствуйте, ivan23i, Вы писали:
I>Ая прогал только на php+Jscript и там нету хеш таблиц. И работа с массивами элементарнее. ни надо ни размерность ни тим указывать
Значит там внутри аналог нетовского ArrayList. Ему вот тоже ни размерность ни тип указывать не нужно.
Здравствуйте, ivan23i, Вы писали:
I>Хеш-таблиц там точно нет, если бы были то я бы думаю что сталкивался.
Точно есть
An array in PHP is actually an ordered map. A map is a type that maps values to keys. This type is optimized in several ways, so you can use it as a real array, or a list (vector), hashtable (which is an implementation of a map), dictionary, collection, stack, queue and probably more.
VD>Нет. Как видишь массивы массивов гибче. К тому же с обычными массивами (в том числе и вложенными) дотнет работает командами MSIL-а которые переводятся непосредственно в команды процессора, а с многомерными работа идет через функции (не видимо для программиста). Это замедляет код.
Здравствуйте, ivan23i, Вы писали:
I>Я думаю не смертельно же если человеку что-то не понятно. помоему это хорошо что есть вопросы — значит он думает.
I>Если не сложно посовеетуй книжку по алгоритмам и структурам данных.
Была одна книжка... к сожалению не помню как назыается. Там били алгоритмы на VB. Главное достоинство — очень доходчивое изложение и максимально простые примеры. Естественно на ВБ, что заставит изучить еще один язык. Но — это не такая большая проблема. Во-первых, ВБ очень простой язык. Во-вторых, после второго языка изучение остальных (того же типа, например, после перла изучать С++ тяжеловато, а после С++ очень непросто понять Пролог) дается очень легко.
I>Ну а ктому что все типизированно. начинаю привыкать. Не знаю просто мне почему т понравился C#, да и для разработки КИС он помоему самое подходящее решение!
Да для разработки прикладных систем он то что нужно. Надежно и быстро. Но учить в нем нужно много чего. Даже собственно не в нем, а в библиотеках и дотнете. За-то скорость (простота) разработки и качество выше чем у большинства конкурентов.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, gbush, Вы писали:
G>Но jagged массивы не соответствуют CLS
Запрета на то, чтобы элементом массива был другой массив нет. Другое дело, что на имеющихся языках (С++ и ВБ) с такими массивами придется повазиться. Там они доступны только через АПИ.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ivan23i, Вы писали:
I>>Я думаю не смертельно же если человеку что-то не понятно. помоему это хорошо что есть вопросы — значит он думает.
VD>
I>>Если не сложно посовеетуй книжку по алгоритмам и структурам данных.
VD>Была одна книжка... к сожалению не помню как назыается. Там били алгоритмы на VB. Главное достоинство — очень доходчивое изложение и максимально простые примеры. Естественно на ВБ, что заставит изучить еще один язык. Но — это не такая большая проблема. Во-первых, ВБ очень простой язык. Во-вторых, после второго языка изучение остальных (того же типа, например, после перла изучать С++ тяжеловато, а после С++ очень непросто понять Пролог) дается очень легко.
C VB на C# легко переходить, особенно в свете то что VB.Net резко отличается от VB6. А вот с С# на С++ — не очень. Да и не хочется(почему то) ...
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ivan23i, Вы писали:
I>>ХМ, разве масисв массивов не одно и тоже что и много мерный массив?
VD>Да. Это разные вещи. Вот смотри: VD>
VD>// Массива массивов интов. Инициализируется пустым массивом.
VD>int[][] aryOfAryOfInt = new int[3][];
VD>// А вот это уже многомерный массив
VD>int[,][] aryIntMatrix = new int[3,3];
VD>// А вот разница
VD>aryOfAryOfInt[0] = new int[2];
VD>aryOfAryOfInt[1] = new int[1000];
VD>aryOfAryOfInt[2] = null;
VD>aryOfAryOfInt[0][1] = 123;
VD>aryIntMatrix[0,1] = 123;
VD>
Инетересно а можно создать Массив Массивов Массивов? Что то вроде int [][][] CFG2 = new int [x][][]. Я пытался — что то не чего не выходит. Интересно как его инициализировать в конструкторе?
Здравствуйте, ExtraLamer, Вы писали:
EL>C VB на C# легко переходить, особенно в свете то что VB.Net резко отличается от VB6.
Какая-то странная логика. ВБ6 отличается от ВБ7 куда меньше чем Шарп от ВБ6.
EL>А вот с С# на С++ — не очень.
А. Ну, ты вот это раскажи тем кто переходит.
EL>Да и не хочется(почему то) ...
Кому как. А вот мне что-то на плюсах все меньше и меньше хочется писать. Еще бы шаблоны и так по мелочи, и про плюсы можно бы было начать забывать. Хотя конечно каждому свое...
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ExtraLamer, Вы писали:
EL>Инетересно а можно создать Массив Массивов Массивов?
А в чем проблема? Массив это тип, а значит можно сделать из него элемент массива. Вот только обычно смысла в такой вложенности нет.
EL> Что то вроде int [][][] CFG2 = new int [x][][]. Я пытался — что то не чего не выходит. Интересно как его инициализировать в конструкторе?
int[][][] aiii = new int[][][]
{
new int[][]
{
new int[]{ 1, 2, 3 },
new int[]{ 4, 5, 6 },
new int[]{ 7, 8, 9 }
},
new int[][]
{
new int[]{ 1, 2, 3 },
new int[]{ 4, 5, 6 },
new int[]{ 7, 8, 9 }
}
};
Console.WriteLine("Первый уровень.");
foreach(int[][] aii in aiii)
{
Console.WriteLine("Второй уровень.");
foreach(int[] ai in aii)
{
Console.WriteLine("Третий уровень.");
foreach(int i in ai)
Console.Write(i + "\t");
Console.WriteLine();
}
}
Console.WriteLine("Нажимите Enter зачем-нибудь...");
Console.ReadLine();
Кстати, инициализация реально идет в рантайме. Жертвы крутому рантайму.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>C VB на C# легко переходить, особенно в свете то что VB.Net резко отличается от VB6. VD>Какая-то странная логика. ВБ6 отличается от ВБ7 куда меньше чем Шарп от ВБ6.
Это да.
EL>>А вот с С# на С++ — не очень. VD>А. Ну, ты вот это раскажи тем кто переходит.
А что, кто-то переходит? В смысле начинает изучать с++ с нуля, под дотнетом — или как?
EL>>Да и не хочется(почему то) ... VD>Кому как. А вот мне что-то на плюсах все меньше и меньше хочется писать. Еще бы шаблоны и так по мелочи, и про плюсы можно бы было начать забывать. Хотя конечно каждому свое...
Да, но не стоит забывать, что есть ведь не только прикладная разработка.
Здравствуйте, VladD2, Вы писали:
VD>Все разработки к чему-то прикладываются.
VD>Ну, драйверы, ну, ОС, ну, реалтайм-задачи. Остальное без проблем пишется на дотнете.
Не знаю, что-то последнее время я начинаю сомневаться в том, что дотнет будет господствовать "на столе". В вебе — это да. А вот для настольных приложений. Уже ведь "второе поколение", так сказать, близится к концу, а что из настольного было на дотнете написано? Даже МС как-то не торопится. Как бы не разделил он в этом плане участь джавы...
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>Инетересно а можно создать Массив Массивов Массивов?
VD>А в чем проблема? Массив это тип, а значит можно сделать из него элемент массива. Вот только обычно смысла в такой вложенности нет.
EL>> Что то вроде int [][][] CFG2 = new int [x][][]. Я пытался — что то не чего не выходит. Интересно как его инициализировать в конструкторе?
VD>
VD>int[][][] aiii = new int[][][]
VD>{
VD> new int[][]
VD> {
VD> new int[]{ 1, 2, 3 },
VD> new int[]{ 4, 5, 6 },
VD> new int[]{ 7, 8, 9 }
VD> },
VD> new int[][]
VD> {
VD> new int[]{ 1, 2, 3 },
VD> new int[]{ 4, 5, 6 },
VD> new int[]{ 7, 8, 9 }
VD> }
VD>};
VD>Console.WriteLine("Первый уровень.");
VD>foreach(int[][] aii in aiii)
VD>{
VD> Console.WriteLine("Второй уровень.");
VD> foreach(int[] ai in aii)
VD> {
VD> Console.WriteLine("Третий уровень.");
VD> foreach(int i in ai)
VD> Console.Write(i + "\t");
VD> Console.WriteLine();
VD> }
VD>}
VD>Console.WriteLine("Нажимите Enter зачем-нибудь...");
VD>Console.ReadLine();
VD>
спасибо за ответ. Такая форма записи массива хоть и более понятна, но менее гибка, инициализировать всё же лучше будет в конструкторе (по крайней мере моя программа этого требует). Методом тыка всё таки удалось создать Массив_Массивов_Массивов, с инициализацией в конструкторе. Хотя синтаксис весьма странный, особенно не понравилось обьявления второго уровня. исходник внизу.
VD>Кстати, инициализация реально идет в рантайме. Жертвы крутому рантайму.
В каком смысле?
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace Arrays_of_Arrays_of_Arrays
{
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
public int[][][] aiii = new int[2][][];
public Form1()
{
// Первый уровень ...
aiii [0] = new int[2][];
aiii [1] = new int[3][];
// Второй уровень ...
// aiii [0]:
// 1
aiii [0][0] = new int[2];
// 2
aiii [0][1] = new int[1];
// aiii [1]:
// 3
aiii [1][0] = new int[3];
// 4
aiii [1][1] = new int[2];
// 5
aiii [1][2] = new int[1];
// Третий уровень ...
// Заполняем элементами
// 1
aiii[0][0][0] = 1;
aiii[0][0][1] = 2;
// 2
aiii[0][1][0] = 3;
// 3
aiii[1][0][0] = 4;
aiii[1][0][1] = 5;
aiii[1][0][2] = 6;
// 4
aiii[1][1][0] = 7;
aiii[1][1][1] = 8;
// 5
aiii[1][2][0] = 9;
InitializeComponent();
}
static void Main()
{
Application.Run(new Form1());
}
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
// this.button1.Location = new System.Drawing.Point(160, 64);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(56, 56);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// Form1
// this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(292, 265);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.ResumeLayout(false);
}
private void button1_Click(object sender, System.EventArgs e)
{
/*
типа тут печать массива должна была быть ...
*/
// Application.Exit();
// Console.WriteLine("Нажимите Enter зачем-нибудь...");
// Console.ReadLine();
}
}
}
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>C VB на C# легко переходить, особенно в свете то что VB.Net резко отличается от VB6.
VD>Какая-то странная логика. ВБ6 отличается от ВБ7 куда меньше чем Шарп от ВБ6.
К сожалению отличается — VB7 делали, как известно с расчётом под MSIL, тут переменные variant — не пройдут. Так что когда стал выбор у любителей VB — между VB7 и С# то многие, перешли на C#. Так как VB7 и С# — различаются только синтаксисом, а так — одно и то же. Кто му же многим понравилось что в C# отсутствуют (точнее: они там есть но обходится без них попроще, чем обходится без них на С++) указатели(Все VB программисты — вздрогнули ).
EL>>А вот с С# на С++ — не очень.
VD>А. Ну, ты вот это раскажи тем кто переходит.
EL>>Да и не хочется(почему то) ...
VD>Кому как. А вот мне что-то на плюсах все меньше и меньше хочется писать. Еще бы шаблоны и так по мелочи, и про плюсы можно бы было начать забывать. Хотя конечно каждому свое...
Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN. SUN наверно всё сделает что бы на *nix — была только Java , а Mono прикроют по тихоньку.
Здравствуйте, ExtraLamer, Вы писали:
EL>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN. SUN наверно всё сделает что бы на *nix — была только Java , а Mono прикроют по тихоньку.
Во-первых, добрался. Как ты сам заметил — это mono.
А во-вторых, Ximian-а купил не SUN, а Novell (читать тут). И mono сворачивать они не собираются, а наоборот, обещают развивать.
Здравствуйте, ExtraLamer, Вы писали:
EL>К сожалению отличается — VB7 делали, как известно с расчётом под MSIL, тут переменные variant — не пройдут. Так что когда стал выбор у любителей VB — между VB7 и С# то многие, перешли на C#. Так как VB7 и С# — различаются только синтаксисом, а так — одно и то же. Кто му же многим понравилось что в C# отсутствуют (точнее: они там есть но обходится без них попроще, чем обходится без них на С++) указатели(Все VB программисты — вздрогнули ).
Отличается не только синтаксисом. В VB7 многое оставили не то чтобы для совместимости не то чтобы с VB6, а скорее с программистами на VB6 . Тут тебе и модули и прочая фигня. К тому же во многих случаях в VB7 осуществляется автоматическое обратное приведение к типу, что может весьма серьезно повлиять на дизайн всего приложения. Там и шаблоны-то по большому счету не так уж нужны.
EL>>>А вот с С# на С++ — не очень.
VD>>А. Ну, ты вот это раскажи тем кто переходит.
EL>>>Да и не хочется(почему то) ...
VD>>Кому как. А вот мне что-то на плюсах все меньше и меньше хочется писать. Еще бы шаблоны и так по мелочи, и про плюсы можно бы было начать забывать. Хотя конечно каждому свое...
EL>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN. SUN наверно всё сделает что бы на *nix — была только Java , а Mono прикроют по тихоньку.
Вообще добрался, а вот приживется ли... А оно тебе нужно?
Здравствуйте, ExtraLamer, Вы писали:
EL>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN.
Блин, как в анекдоте. Во-первых не Sun, а Novell, во-вторых разработку mono собираются не закрывать а наоборот финансировать.
Hello, Воронков!
You wrote on Mon, 25 Aug 2003 20:14:40 GMT:
хъ
Согласен.
Еще не скоро дотнет будет у каждого юзера на машине, это раз.
Два — производительность. Я как-то писал програмульку, которая заливает
содержимое файловой системы (без собственно данных, просто атрибуты) в БД.
Это было нечто! Programm files заливался часов 5-6!
WTL для лекгих клиентов рулит!
Hello, Воронков!
You wrote on Tue, 26 Aug 2003 05:36:46 GMT:
хъ ВВ> Отличается не только синтаксисом. В VB7 многое оставили не то чтобы для ВВ> совместимости не то чтобы с VB6, а скорее с программистами на VB6 ВВ> . Тут тебе и модули и прочая фигня. К тому же во многих случаях в VB7 ВВ> осуществляется автоматическое обратное приведение к типу, что
может ВВ> весьма серьезно повлиять на дизайн всего приложения.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Еще не скоро дотнет будет у каждого юзера на машине, это раз.
При теперешних размерах дистрибутивов не особо страшно. Да и будет он достаточно скоро, как начнут дозревать первые коробочные продукты на нем.
AS>Два — производительность. Я как-то писал програмульку, которая заливает AS>содержимое файловой системы (без собственно данных, просто атрибуты) в БД. AS>Это было нечто! Programm files заливался часов 5-6!
И при чем тут дотнет? У тебя на работу с БД и диском и уходит основное время, а управляемый код скорее всего занимает десятые доли процента.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Hello, Воронков! AS>You wrote on Tue, 26 Aug 2003 05:36:46 GMT:
AS>хъ ВВ>> Отличается не только синтаксисом. В VB7 многое оставили не то чтобы для ВВ>> совместимости не то чтобы с VB6, а скорее с программистами на VB6 ВВ>> . Тут тебе и модули и прочая фигня. К тому же во многих случаях в VB7 ВВ>> осуществляется автоматическое обратное приведение к типу, что AS>может ВВ>> весьма серьезно повлиять на дизайн всего приложения.
AS>Не понял.
Imports System.Xml
Imports System.Xml.Serialization
Imports System.IO
Module Module1
Sub Main()
Dim AInst As New A
Dim OInst As New Object
OInst = AInst
OInst.MyFuckingMethod() 'Sic!End Sub
End Module
Public Class A
Public Sub MyFuckingMethod()
Console.WriteLine("Some shit")
Console.ReadLine()
End Sub
End Class
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Hello, Воронков! AS>You wrote on Mon, 25 Aug 2003 20:14:40 GMT:
AS>хъ AS>Согласен. AS>Еще не скоро дотнет будет у каждого юзера на машине, это раз. AS>Два — производительность. Я как-то писал програмульку, которая заливает AS>содержимое файловой системы (без собственно данных, просто атрибуты) в БД. AS>Это было нечто! Programm files заливался часов 5-6! AS>WTL для лекгих клиентов рулит!
Честно говоря, я-то как раз думаю, что с производительностью у дотнета вполне нормально. Тут у меня нареканий даже нет. Вспомни, какое было раньше одно из самых популярных средств разработки — VB6. А у него как с производительностью? С до-диезом даже сравивать смешно.
К тому же мощность компов имеет склонность удваиваться каждые 18 месяцев.
Тут скорее об отношении речь. Меня вот действительно беспокоит тот факт, что настольные плаги на дотнете что-то не особенно торопятся писать — я имею в виду проги широкого масштаба, разумеется.
VD>Ну, не знаю я с С++ и Дельфи за пять минут перелез. Конечно тонкости есть везде, но хэш-таблицы они и в африке хэш-таблицы (правда в Дельфи они появились только в шестерке).
Действительно появились? Вот чёрт, а я и не знал. Как называется?
I>>Ая прогал только на php+Jscript и там нету хеш таблиц. И работа с массивами элементарнее. ни надо ни размерность ни тим указывать, что хочешь то и твориш, поэтому для меня ново, вот и спрашиваю.
VD>Это скриптовые языки. У них свои особенности. Они очень ограничены и многое им не дано. Но и там, и там есть библиотеки расширения и хэш-таблицы среди них точно имеются.
Насколько я слышал, хеш-таблицы именно в Perl особенно прижились.
Здравствуйте, WFrag, Вы писали:
WF>Здравствуйте, ExtraLamer, Вы писали:
EL>>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN. SUN наверно всё сделает что бы на *nix — была только Java , а Mono прикроют по тихоньку.
WF>Во-первых, добрался. Как ты сам заметил — это mono. WF>А во-вторых, Ximian-а купил не SUN, а Novell (читать тут). И mono сворачивать они не собираются, а наоборот, обещают развивать.
Цитата: "Sun Microsystems связана с Linux самым прямым образом — едва ли месяц назад приобретя компанию Ximian (ту самую, что работает над проектом Mono — варианта платформы .Net для Linux), в сентябре она грозитсявыпустить на массовый рынок собственный пакет десктоп-приложений для свободной ОС под названием Mad Hutter." Этож надо так новость перетря(а)хнуть ...
У Novell — денег мало ... уж лучше бы и вправду Sun купила А лучше всего — IBM!
Надо сказать, что после покупки Novell, snapshot'ы перестали выкладывать (последний от 16 августа) ... а раньше каждый день выкладывали — может это и есть конец Mono?(
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Здравствуйте, ExtraLamer, Вы писали:
EL>>К сожалению отличается — VB7 делали, как известно с расчётом под MSIL, тут переменные variant — не пройдут. Так что когда стал выбор у любителей VB — между VB7 и С# то многие, перешли на C#. Так как VB7 и С# — различаются только синтаксисом, а так — одно и то же. Кто му же многим понравилось что в C# отсутствуют (точнее: они там есть но обходится без них попроще, чем обходится без них на С++) указатели(Все VB программисты — вздрогнули ).
ВВ>Отличается не только синтаксисом. В VB7 многое оставили не то чтобы для совместимости не то чтобы с VB6, а скорее с программистами на VB6 . Тут тебе и модули и прочая фигня. К тому же во многих случаях в VB7 осуществляется автоматическое обратное приведение к типу, что может весьма серьезно повлиять на дизайн всего приложения. Там и шаблоны-то по большому счету не так уж нужны.
EL>>>>А вот с С# на С++ — не очень.
VD>>>А. Ну, ты вот это раскажи тем кто переходит.
EL>>>>Да и не хочется(почему то) ...
VD>>>Кому как. А вот мне что-то на плюсах все меньше и меньше хочется писать. Еще бы шаблоны и так по мелочи, и про плюсы можно бы было начать забывать. Хотя конечно каждому свое...
EL>>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN. SUN наверно всё сделает что бы на *nix — была только Java , а Mono прикроют по тихоньку.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, ExtraLamer, Вы писали:
EL>>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN.
AVK>Блин, как в анекдоте. Во-первых не Sun, а Novell, во-вторых разработку mono собираются не закрывать а наоборот финансировать.
Здравствуйте, mihailik, Вы писали:
M>Действительно появились? Вот чёрт, а я и не знал. Как называется?
Да. Только у орлов из Борланда очень бурная фантазия и они назвали их как-то странно. Сейчас уже не помню как. Что-то связанное с бакетами, если не ошибаюсь.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ExtraLamer, Вы писали:
EL>К сожалению отличается — VB7 делали, как известно с расчётом под MSIL,
Что характерно, Шарпм тоже.
EL> тут переменные variant — не пройдут.
Тут пройдут Objects, что намного гибче чем Variant.
EL> Так что когда стал выбор у любителей VB — между VB7 и С# то многие, перешли на C#.
Вот и непотна логика. Если ты уже знаешь ВБ, а разницы между Шарпом и ВБ нет, то зачем переходить то?
Думаю, такой выбор объясняется другими факторами. Шарп рекламируется как язык специльно разработанный под дотнет, да и вообще в рекламу Шарпа вкладывается такие суммы, что было бы страно если это не происходило.
EL> Так как VB7 и С# — различаются только синтаксисом, а так — одно и то же.
Ну, разница то как раз очень даже существенная. Шарп больше заточен на системные нужды, а ВБ имеет больше функций для прикладного программировния и автоматизации. Да и синтаксис у ВБ по проще.
EL> Кто му же многим понравилось что в C# отсутствуют (точнее: они там есть но обходится без них попроще, чем обходится без них на С++) указатели(Все VB программисты — вздрогнули ).
А что в ВБ7 их встроили? Или это снова антилогические рассцждения?
EL>Да просто до Linux и прочих *nix, С# ещё не добрался, а там только плюсы и есть. Возможно и не доберётся, в свете покупки Ximian — SUN. SUN наверно всё сделает что бы на *nix — была только Java , а Mono прикроют по тихоньку.
Я не знаю кто прикрывает Моно. Судя по резальтатам он развивается и очень успешно. Моно — это опен-сорсный проект и прекрыть его не так то просто.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
ВВ> Dim OInst As New Object
ВВ> OInst = AInst
ВВ> OInst.MyFuckingMethod() 'Sic!
ВВ>
Это называется по другому. Это называется поздинм связыванием. В отличии от шаблонов приводит к тормозам и ошибкам времени компиляции. Нужно в основном для скриптов.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Hello, AndrewVK!
You wrote on Tue, 26 Aug 2003 09:12:06 GMT:
AS>> Еще не скоро дотнет будет у каждого юзера на машине, это раз.
A> При теперешних размерах дистрибутивов не особо страшно. Да и будет он A> достаточно скоро, как начнут дозревать первые коробочные продукты на A> нем.
Хм. Когда это скоро?
AS>> Два — производительность. Я как-то писал програмульку, которая AS>> заливает содержимое файловой системы (без собственно данных, просто AS>> атрибуты) в БД. Это было нечто! Programm files заливался часов 5-6!
A> И при чем тут дотнет? У тебя на работу с БД и диском и уходит основное
время, A> а управляемый код скорее всего занимает десятые доли процента.
Да. Ты проверял?
Первые пол часа у меня все заливалось на ура. Десятки файлов в сек. К концу
в среднем было 1 файл на несколько секунд.
Периодически все застывало на несколько секунд (до полу минуты) и потом
скорость увеличивалась. Это ясно что.
З.Ы. Я думаю, что проблемы была в рекурсивном вызове процедуры закачки для
каталогов. Видимо, используемые ресурсы из-за этого не освобождались.
Кстати, памятухи прога жрала не много и процессор не тормозила. Базенка
загружена абсолютно не была.
Кстати, програмулина-то не сложная. Попробуй сам, если не веришь.
З.Ы.Ы. OLTP сервера я на нем точно писать не буду.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Воронков Василий, Вы писали: ВВ>>
ВВ>> Dim OInst As New Object
ВВ>> OInst = AInst
ВВ>> OInst.MyFuckingMethod() 'Sic!
ВВ>>
VD>Это называется по другому. Это называется поздинм связыванием. В отличии от шаблонов приводит к тормозам и ошибкам времени компиляции. Нужно в основном для скриптов.
Да я не спорю, только вот значит ли это, что ничто не будет этим пользоваться? В вб6 — это была стандартная практика. И вполне может серьезно повлиять на дизайн приложения — разве нет?
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Не знаю, что-то последнее время я начинаю сомневаться в том, что дотнет будет господствовать "на столе". В вебе — это да. А вот для настольных приложений. Уже ведь "второе поколение", так сказать, близится к концу, а что из настольного было на дотнете написано? Даже МС как-то не торопится. Как бы не разделил он в этом плане участь джавы...
А ты на подпись под своим и моим сообщением посмотри. Потом посмотри на то что в качестве макросов в стидии используется. Потом глять на 2003-ий офис. Виндовс тоже долго приживалась... ничего прижелась. Помнишь сколько таких же сомнений было по поводу виндовс?
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Еще не скоро дотнет будет у каждого юзера на машине, это раз. AS>Два — производительность. Я как-то писал програмульку, которая заливает AS>содержимое файловой системы (без собственно данных, просто атрибуты) в БД. AS>Это было нечто! Programm files заливался часов 5-6! AS>WTL для лекгих клиентов рулит!
Ну, это как писать. Я вот тут написал парсер шарпа. Так он за пару секунд весь янус прочитывает, а это более сони файлов. Да что там Янус... он весь Моно сканирует за несколько секунд, а это несколько тысяч файло. И при это я даже не извращался с конвертацией всего в массив символов, все на обычных строках.
Ты вот тот же код на WTL пробовал писать? И как он был намного быстрее? Может дело в объемах, или в том что общение с БД через SQL — это не самое быстрое занятие?
PS
В общем, нужно завязывать это разговор, а то он скоро в очередной "vs." первратится.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Честно говоря, я-то как раз думаю, что с производительностью у дотнета вполне нормально. Тут у меня нареканий даже нет. Вспомни, какое было раньше одно из самых популярных средств разработки — VB6. А у него как с производительностью? С до-диезом даже сравивать смешно. ВВ>К тому же мощность компов имеет склонность удваиваться каждые 18 месяцев.
Полностью солидарен. Конечно если ускорят, то мы не откажемся, но и сейчас нормально. Особенно по сравнению со скоростью разработки.
ВВ>Тут скорее об отношении речь. Меня вот действительно беспокоит тот факт, что настольные плаги на дотнете что-то не особенно торопятся писать — я имею в виду проги широкого масштаба, разумеется.
Лиха беда начало... Следующая версия ОС от МС будет содержать в себе дотнет. По слухам она даже частично будет на нем написана со всеми вытекающими... Пройдет еще год-другой и дотнетным рантаймом будет завалены все машины. Тут главное, чтобы программистам это нужн было.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>И при чем тут дотнет? У тебя на работу с БД и диском и уходит основное время, а управляемый код скорее всего занимает десятые доли процента.
Не, ну, можно же и хмл парсить часами, если с пристрастием...
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, mihailik, Вы писали:
M>>Действительно появились? Вот чёрт, а я и не знал. Как называется?
AVK>TStringHash по моему
Нет. Это фигня. Да и назывался он по другому.
Задолбали... ну, почему именно я должен в хэлп лазить?
... В общем, нашел... TBucketList называется. Почему так? Дык я же говорю делали орлы! Но не те что гордо парять в горах, а лесные, что дерево ключам долбят.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, WFrag, Вы писали:
WF>Во-первых, добрался. Как ты сам заметил — это mono. WF>А во-вторых, Ximian-а купил не SUN, а Novell (читать тут). И mono сворачивать они не собираются, а наоборот, обещают развивать.
Вот это то и опастно. В последнее время за Новолом закрепилась устойчивая репутация похоронной контры. Все продукты попадающие к ним исчезают. Кроме них еще есть два похоронщика CA и Семантик.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ExtraLamer, Вы писали:
EL>У Novell — денег мало ... уж лучше бы и вправду Sun купила А лучше всего — IBM!
Сан? Да они любой продукт связанный с дотнетом сразу похоронят. А уж Моно уничтожат так что и следа не останется. А IBM... да они и сами за пару месяцев могут нечто подобное слабать.
EL>Надо сказать, что после покупки Novell, snapshot'ы перестали выкладывать (последний от 16 августа) ... а раньше каждый день выкладывали — может это и есть конец Mono?(
Будет жаль. Комерческий дотнет уже есть. А комерческий дотнет на линуксе мне и на фиг не упал.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, ExtraLamer, Вы писали:
EL>спасибо за ответ. Такая форма записи массива хоть и более понятна, но менее гибка,
Чем же это?
EL> инициализировать всё же лучше будет в конструкторе
И в чем проблема? Я же тебе сказал, что реально инициализация идет в рантайме. Ты можешь с тем же успхам перенести эту инициализацию в конструктор и даже использовать переменные в для задания размеров массивов.
VD>>Кстати, инициализация реально идет в рантайме. Жертвы крутому рантайму.
EL>В каком смысле?
В прямом. См. выше.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>Не знаю, что-то последнее время я начинаю сомневаться в том, что дотнет будет господствовать "на столе". В вебе — это да. А вот для настольных приложений. Уже ведь "второе поколение", так сказать, близится к концу, а что из настольного было на дотнете написано? Даже МС как-то не торопится. Как бы не разделил он в этом плане участь джавы...
VD>А ты на подпись под своим и моим сообщением посмотри. Потом посмотри на то что в качестве макросов в стидии используется. Потом глять на 2003-ий офис. Виндовс тоже долго приживалась... ничего прижелась. Помнишь сколько таких же сомнений было по поводу виндовс?
Ну хоум-то все-таки проект "в пределах сообщества". А 2003 офис — разве под дотнет Или ты имеешь в виду, что он как и студия — т.е. managed код там тоже присутствует?
Просто хотелось бы посмотреть на действительно крупные успешные коммерческие проекты под дотнет. А вот нету их пока
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Хм. Когда это скоро?
Надеюсь в ближайший год-два.
A>> а управляемый код скорее всего занимает десятые доли процента.
AS>Да. Ты проверял?
А тут и проверять нечего, все что ты описал не имеет отношения к самому коду. Так что либо ты лукавишь и чего то недоговариваешь, либо от дотнета тут ничего не зависит.
AS>Первые пол часа у меня все заливалось на ура. Десятки файлов в сек. К концу AS>в среднем было 1 файл на несколько секунд. AS>Периодически все застывало на несколько секунд (до полу минуты) и потом AS>скорость увеличивалась. Это ясно что.
Понятия не имею, я твой код не видел. Опиши задачку подробнее, сделаю тебе программку которая зависать и останавливаться не будет.
AS>Кстати, програмулина-то не сложная. Попробуй сам, если не веришь.
Давай. Время будет попробую. Мож действительно баг где.
AS>З.Ы.Ы. OLTP сервера я на нем точно писать не буду.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну хоум-то все-таки проект "в пределах сообщества".
А что это меняет?
ВВ>А 2003 офис — разве под дотнет
Нет, но писать для него макросы на дотнете уже можно.
ВВ>Просто хотелось бы посмотреть на действительно крупные успешные коммерческие проекты под дотнет. ВВ> А вот нету их пока
Просто класс System.Array — это пока единственный шаблонный тип в .Net (и применяется он со спец. синтаксисом).
Редмонтчанам осталось только немного обобщить данную технологию. Делов то — чуть!...
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>Ну хоум-то все-таки проект "в пределах сообщества". AVK>А что это меняет?
Просто его видно только внутри РСДН, а за пределами — ни зги. По большому счету вся пурга по поводу того, что дотнет отстой и происходит из-за того, что не показал он себя пока как успешное средство на десктопе.
ВВ>>Просто хотелось бы посмотреть на действительно крупные успешные коммерческие проекты под дотнет. ВВ>> А вот нету их пока AVK>А крупные проекты за год не написать.
Ну в общем прошло уже несколько больше года. Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Да я не спорю, только вот значит ли это, что ничто не будет этим пользоваться? В вб6 — это была стандартная практика. И вполне может серьезно повлиять на дизайн приложения — разве нет?
Это зависит от квалификации. Если человек (компания) опытные, то врядли он(и) будет делать дизайн приложения на позднем связывании. Лично я много писал на ВБ6, но использовал эту возможность очень редко. За все время раза 2-3 из которых только один раз для полиморфизма. В остальных случаях по шустрому нужно было сделать атомэйшон и было влом для такой мелочи подключать тлб-ху.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну хоум-то все-таки проект "в пределах сообщества".
И тем не менее продукт.
ВВ> А 2003 офис — разве под дотнет Или ты имеешь в виду, что он как и студия — т.е. managed код там тоже присутствует?
Скорее как в студии, но более новая версия. Но тем не менее, везде где будет офис 2003, везде будет дотнет. Думаю, что со временем они и другие части ворда с экселем переведут на дотнет. Энжины (редактор и таблица) скорее всего так и останутся анменеджед (кода слишком много), а вот интерфейс очень даже может быть переписан. Сейчас интерфейс в ворде с экселем создан на базе ActiveX-ов. Все диалоги — это ActiveX-контейнеры, а все кнопки — ActiveX-контролв. Явно что с переходом на дотнет в качестве скриптов это положение нужно будет менять. Да и ВинФормсы намного более качественны чем формы из ворда.
ВВ>Просто хотелось бы посмотреть на действительно крупные успешные коммерческие проекты под дотнет. А вот нету их пока
А что они должны быть обязательно на 100% менэджед? Если нет, то такие продукты уже на подходе. МС пихает дотнет во все новые версии. Опять же по слухам, но тем не менее, следующая версия ОС будет содержать существенный процент менеджед кода, чуть ли не весь эксплорер будет переписан на Шарпе... В mssql будут встроены менеджед-тригеры.
А вообще, новые продукты большого размера требуют большого времени на свою разработку. Многие выжидают. Во общем, все как с виндами во времен ДОС-а и с 95-ыми во времена 3.1-ых.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Alexey Shirshov, Вы писали:
A>> И при чем тут дотнет? У тебя на работу с БД и диском и уходит основное AS>время, A>> а управляемый код скорее всего занимает десятые доли процента.
AS>Да. Ты проверял?
Я проверял. Не твой код конечно, но все же. При общении с БД скорость кода уже не так важна. Именно по этому неблыо никаких проблем в создании клиентов для БД на ВБ. А ведь ВБ6 был дико тормозным. Дотнету до него ой как долеко (это тоже проверял).
AS>Первые пол часа у меня все заливалось на ура. Десятки файлов в сек. К концу AS>в среднем было 1 файл на несколько секунд.
Так может, у тебя что-то с алгоритмом было нета? Или ты где-то память удерживал?
AS>Периодически все застывало на несколько секунд (до полу минуты) и потом AS>скорость увеличивалась. Это ясно что.
И что?
Я вот раз в два месяца генерирую chm для диска. Как раз на дотнетной программе. Первая версия вела себя очень похоже на описанный тобой случай. Потом ИТ поправил ее... Там регэкспы были которые каждый раз заново создавались, а в дотнете в ргэкспах ошибка. В общем, он сделал все регэкспы глобальными и прекомпилированными и программа залетала. Я потом туда еще пару тон регэкспов добавил и все очень даже шустро пашет.
Про парсер я тоже вроде гооврил. Так что ищи проблему в коде, а не в компиляторе/рантайме.
AS>З.Ы. Я думаю, что проблемы была в рекурсивном вызове процедуры закачки для AS>каталогов. Видимо, используемые ресурсы из-за этого не освобождались.
Дык, а зачем же ты их держал? Вызывай из этой рекурсивной процедуры другоую рабочую и делай в ней все что тебе нужно. Память будет освобждаться автоматически. А так... Если ты на С++ начнешь в рекусрсивной процедуре память пачками занимть, то она тоже будет торомозить.
AS>Кстати, памятухи прога жрала не много и процессор не тормозила. Базенка AS>загружена абсолютно не была. AS>Кстати, програмулина-то не сложная. Попробуй сам, если не веришь.
Ну, ты ее код нам покажи, а мы глянем, что не так...
AS>З.Ы.Ы. OLTP сервера я на нем точно писать не буду.
Правильно пиши на плюсах. А то что за работа конторы без периодических AV.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, mihailik, Вы писали:
G>>Но jagged массивы не соответствуют CLS
M>Ты точно помнишь? Не многомерные ли массивы ты имел ввиду?
вложенные
A jagged array is an array whose elements are arrays. The elements of a jagged array can be of different dimensions and sizes. A jagged array is sometimes called an "array-of-arrays."
Note that jagged arrays are not compliant with the common language specification (CLS). This means you should not expose jagged arrays from any class you want CLS-compliant code to consume. For more information, see Arrays.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>ЗЫ. А что значит можно под новый офис макросы на дотнете писать? Т.е. компилируемые макросы? Где об этом можно прочитать?
VSA называется. Почитать естественно в МСДН на МС. А вообще на них и посмотреть можно. В студии именно они, только версией помладше.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну в общем прошло уже несколько больше года. Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.
Тот же АВК работает в одной из довольно известных Московских контор и делают они сейчас пилотный проект на дотнете. Естественно, что сервеная сторона там преобладает, но и десктоп вроде тоже на дотнете пишут.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
G>Note that jagged arrays are not compliant with the common language specification (CLS). This means you should not expose jagged arrays from any class you want CLS-compliant code to consume. For more information, see Arrays.
G>from МСДН
Здорово. А вот описание массивов из стандарта Шарпа принятого екмой как часть стандарта дотнета:
19.1 Array types
An array type is written as a non-array-type followed by one or more rank-specifiers:
A non-array-type is any type that is not itself an array-type.
The rank of an array type is given by the leftmost rank-specifier in the array-type: A rank-specifier indicates that the array is an array with a rank of one plus the number of "," tokens in the rank-specifier.
The element type of an array type is the type that results from deleting the leftmost rank-specifier:
" An array type of the form T[R] is an array with rank R and a non-array element type T.
" An array type of the form T[R][R1]…[RN] is an array with rank R and an element type T[R1]…[RN].
In effect, the rank-specifiers are read from left to right before the final non-array element type. [Example: The type int[][,,][,] is a single-dimensional array of three-dimensional arrays of two-dimensional arrays of int. end example]
At run-time, a value of an array type can be null or a reference to an instance of that array type.
Ведь получается, что тогда часть спецификации не совместима с ней же.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>спасибо за ответ. Такая форма записи массива хоть и более понятна, но менее гибка,
VD>Чем же это?
Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.
EL>> инициализировать всё же лучше будет в конструкторе
VD>И в чем проблема? Я же тебе сказал, что реально инициализация идет в рантайме. Ты можешь с тем же успхам перенести эту инициализацию в конструктор и даже использовать переменные в для задания размеров массивов.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Воронков Василий, Вы писали:
ВВ>>ЗЫ. А что значит можно под новый офис макросы на дотнете писать? Т.е. компилируемые макросы? Где об этом можно прочитать?
VD>VSA называется. Почитать естественно в МСДН на МС. А вообще на них и посмотреть можно. В студии именно они, только версией помладше.
Здравствуйте, ExtraLamer, Вы писали:
EL>Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.
Несовсем. Это и быстрее и удобнее. Быстрее потому, что компилятор может оптимизировать инициализацию, а проще хотя бы потому, что труднее запутаться в невероятном количестве присвоений.
EL>А я что не вконструкторе там инициализировал?
Я имел в виду, что можно перенести инициализацию (именно декларативную) в конструктор и ничего не изменится.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, ExtraLamer, Вы писали:
EL>>Ну вот внизу вы и говорите про конструктор — вот тем. Я сугубо про форму записи. На деле — одно и то же.
VD>Несовсем. Это и быстрее и удобнее. Быстрее потому, что компилятор может оптимизировать инициализацию, а проще хотя бы потому, что труднее запутаться в невероятном количестве присвоений.
Про быстрее — не знаю. Миллисикунды — считать наверно смысла нет. Если уж совсем будет медленно — можно повесить пользователю splash — "Loading ... please wait" .
Что же до удобства — то я думаю вы согласитесь — что это сугубо "дело вкуса".
EL>>А я что не вконструкторе там инициализировал?
VD>Я имел в виду, что можно перенести инициализацию (именно декларативную) в конструктор и ничего не изменится.
Ну я и говори — что не чего не изменится. На деле — одно и то же.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>>>Ну хоум-то все-таки проект "в пределах сообщества". AVK>>А что это меняет?
ВВ>Просто его видно только внутри РСДН, а за пределами — ни зги.
Что это меняет?
ВВ>По большому счету вся пурга по поводу того, что дотнет отстой и происходит из-за того, что не показал он себя пока как успешное средство на десктопе.
И не покажет так быстро, средства разработки за год не меняются. Сколько времени прошло с выхода первых виндов, прежде чем под нее стали появляться серьезные пакеты?
ВВ>Ну в общем прошло уже несколько больше года.
Это слишком мало. Год нужно только чтобы рискнуть начать что то крупное на нем разрабатывать.
ВВ>Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Hello, Воронков! AS>You wrote on Tue, 26 Aug 2003 14:17:33 GMT:
AS>хъ AS>Примечателен и не более того. AS>Я всегда выставляю on на уровне проекта и проблем не знаю.
О чем речь-то вначале шла? О том, что де отличия между вб.нет и диезом — совершенно условны. Я это привел в качестве доказательства обратного, так как на мой взгляд эта фичка довольно важная и считать ее условным отличием нельзя. А можно ведь еще и вспомнить об option explicit, который включен по умолчанию. То есть я собсно не утверждаю, что так нужно писать и что это хорошо.
Hello, VladD2!
You wrote on Tue, 26 Aug 2003 15:59:39 GMT:
[]
V> Я проверял. Не твой код конечно, но все же. При общении с БД скорость V> кода уже не так важна.
Я бы не стал так говорить.
V> Именно по этому неблыо никаких проблем в создании клиентов для БД на ВБ. V> А ведь ВБ6 был дико тормозным. Дотнету до него ой как долеко (это тоже V> проверял).
Про vb6 никто ничего не говорил.
хъ
V> Так может, у тебя что-то с алгоритмом было нета? Или ты где-то память V> удерживал?
А как можно память удерживать?
хъ
AS>> З.Ы. Я думаю, что проблемы была в рекурсивном вызове процедуры закачки AS>> для каталогов. Видимо, используемые ресурсы из-за этого не AS>> освобождались.
V> Дык, а зачем же ты их держал? Вызывай из этой рекурсивной процедуры V> другоую рабочую и делай в ней все что тебе нужно. Память будет V> освобждаться автоматически. А так... Если ты на С++ начнешь в V> рекусрсивной процедуре память пачками занимть, то она тоже будет V> торомозить.
Ничего тормозить не будет. К тому же, память програмулиной вообще,
практически, не жралась.
хъ
V> Ну, ты ее код нам покажи, а мы глянем, что не так...
Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу
особо к стилю не привязываться.
Class CApp
Public path As String
Public recursive As Boolean
Private tabs As String
Private conn As New SqlConnection("Data Source=machine;User
id=user;password=password")
Sub New(ByVal path As String, ByVal r As Boolean)
If Directory.Exists(path) Then
MyClass.path = path
recursive = r
conn.Open()
Else
Throw New DirectoryNotFoundException()
End If
End Sub
Public Sub Process()
Process(path)
End Sub
Private Sub Process(ByVal path As String)
Dim cmd As New SqlCommand()
Dim b As Boolean
Dim oldtabs As String
With cmd
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
With .Parameters(0)
.ParameterName = "@return_value"
.SqlDbType = SqlDbType.Int
.Direction = ParameterDirection.ReturnValue
End With
With .Parameters(1)
.ParameterName = "@name"
.SqlDbType = SqlDbType.NVarChar
.Size = 1000
.Direction = ParameterDirection.Input
End With
With .Parameters(2)
.ParameterName = "@sd"
.SqlDbType = SqlDbType.Text
.Direction = ParameterDirection.Input
End With
With .Parameters(3)
.ParameterName = "@parent"
.SqlDbType = SqlDbType.Int
.Direction = ParameterDirection.Input
End With
.Parameters(1).Value = path
.Parameters(2).Value = ""
.Parameters(3).Value = 0
.CommandText = "CreateFolder"
.CommandType = CommandType.StoredProcedure
.Connection = conn
Try
.ExecuteNonQuery()
Catch e As SqlException
b = True
Console.WriteLine(tabs & path & vbTab & " - error
message: " & e.Message)
End Try
End With
If Not b Then
Dim s As String
Dim retval As Integer =
Convert.ToInt32(cmd.Parameters(0).Value)
If retval > 0 Then
s = tabs & path & vbTab & " - inserts under " &
retval.ToString()
Else
s = tabs & path & vbTab & " - error code " &
retval.ToString()
End If
Console.WriteLine(s)
If retval > 0 Then
Dim di As New DirectoryInfo(path)
Dim fi As FileInfo
Dim dir As DirectoryInfo
UpdateFileInfo(di, retval)
tabs += " "Dim FolderId As Integer = retval
cmd.Parameters.Add(cmd.CreateParameter())
For Each fi In di.GetFiles()
cmd.Parameters(1).Value = fi.FullName
cmd.Parameters(2).Value = ""
cmd.Parameters(3).Value = FolderId
With cmd.Parameters(4)
.SqlDbType = SqlDbType.Int
.Direction = ParameterDirection.Input
.ParameterName = "@aid"
.Value = UpdateFileAttributes(fi.Attributes,
fi.Name)
End With
cmd.CommandText = "CreateFile"Try
cmd.ExecuteNonQuery()
Catch e As SqlException
b = True
Console.WriteLine(tabs & fi.Name & vbTab & " -
error message: " & e.Message)
End Try
If Not b Then
retval =
Convert.ToInt32(cmd.Parameters(0).Value)
If retval > 0 Then
s = tabs & fi.Name & vbTab & " - inserts
under " & retval.ToString()
Else
s = tabs & fi.Name & vbTab & " - error code
" & retval.ToString()
End If
Console.WriteLine(s)
If retval > 0 Then
Dim cmd1 As New SqlCommand()
UpdateFileInfo(fi, retval)
With cmd1
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
With .Parameters(0)
.SqlDbType = SqlDbType.BigInt
.Direction =
ParameterDirection.Input
.ParameterName = "@fs"
.Value = fi.Length
End With
With .Parameters(1)
.SqlDbType = SqlDbType.Int
.Direction =
ParameterDirection.Input
.ParameterName = "@id"
.Value = retval
End With
.CommandText = "update RealFile set
FileSize=" & _
"@fs where id = @id"
.Connection = conn
.CommandType = CommandType.Text
Try
.ExecuteNonQuery()
Catch e As SqlException
Console.WriteLine(tabs & fi.Name &
vbTab & " - error message: " & e.Message)
End Try
End With
End If
End If
Next
For Each dir In di.GetDirectories()
oldtabs = tabs
Process(dir.FullName) ' вот он! - рекурсивный вызов
tabs = oldtabs
Next
End If
End If
End Sub
Private Sub UpdateFileInfo(ByVal fsi As FileSystemInfo, ByVal id As
Integer)
Dim cmd As New SqlCommand()
With cmd
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
With .Parameters(0)
.SqlDbType = SqlDbType.DateTime
.Direction = ParameterDirection.Input
.ParameterName = "@c"
.Value = fsi.CreationTime
End With
With .Parameters(1)
.SqlDbType = SqlDbType.DateTime
.Direction = ParameterDirection.Input
.ParameterName = "@a"
.Value = fsi.LastAccessTime
End With
With .Parameters(2)
.SqlDbType = SqlDbType.DateTime
.Direction = ParameterDirection.Input
.ParameterName = "@w"
.Value = fsi.LastWriteTime
End With
With .Parameters(3)
.SqlDbType = SqlDbType.Int
.Direction = ParameterDirection.Input
.ParameterName = "@id"
.Value = id
End With
.CommandText = "update FileBase set " & _
"CreationTime = @c," & _
"LastAccessTime = @a," & _
"LastWriteTime = @w where id = @id"
.CommandType = CommandType.Text
.Connection = conn
Try
.ExecuteNonQuery()
Catch e As SqlException
Console.WriteLine(tabs & fsi.Name & vbTab & " - error
message: " & e.Message)
End Try
End With
End Sub
Private Function UpdateFileAttributes(ByVal fa As FileAttributes,
ByVal fname As String) As Integer
Dim cmd As New SqlCommand()
With cmd
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
.Parameters.Add(.CreateParameter())
With .Parameters(0)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@a"
.Direction = ParameterDirection.Input
.Value = (fa = fa.Archive)
End With
With .Parameters(1)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@c"
.Direction = ParameterDirection.Input
.Value = (fa = fa.Compressed)
End With
With .Parameters(2)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@e"
.Direction = ParameterDirection.Input
.Value = (fa = fa.Encrypted)
End With
With .Parameters(3)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@h"
.Direction = ParameterDirection.Input
.Value = (fa = fa.Hidden)
End With
With .Parameters(4)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@n"
.Direction = ParameterDirection.Input
.Value = (fa = fa.Normal)
End With
With .Parameters(5)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@r"
.Direction = ParameterDirection.Input
.Value = (fa = fa.ReadOnly)
End With
With .Parameters(6)
.SqlDbType = SqlDbType.Bit
.ParameterName = "@s"
.Direction = ParameterDirection.Input
.Value = (fa = fa.System)
End With
With .Parameters(7)
.SqlDbType = SqlDbType.Int
.ParameterName = "@id"
.Direction = ParameterDirection.Output
End With
.CommandText = "AddAttr"
.CommandType = CommandType.StoredProcedure
.Connection = conn
Try
.ExecuteNonQuery()
Catch e As SqlException
Console.WriteLine(tabs & fname & vbTab & " - error
message: " & e.Message)
End Try
End With
Return Convert.ToInt32(cmd.Parameters("@id").Value)
End Function
End Class
AS>> З.Ы.Ы. OLTP сервера я на нем точно писать не буду.
V> Правильно пиши на плюсах. А то что за работа конторы без периодических
AV
AV ловят криворукие программеры и новички.
У меня, последние AV, с которыми я трахался, были связаны с багами в ATL.
Все!
Писать на плюсах просто надо уметь.
Hello, AndrewVK!
You wrote on Tue, 26 Aug 2003 15:10:39 GMT:
хъ
A> А тут и проверять нечего, все что ты описал не имеет отношения к самому A> коду. Так что либо ты лукавишь и чего то недоговариваешь, либо от A> дотнета тут ничего не зависит.
А ты посмотри код (запостил в ответ Владу).
хъ
A> Понятия не имею, я твой код не видел. Опиши задачку подробнее, сделаю A> тебе программку которая зависать и останавливаться не будет.
Здравствуйте, Alexey Shirshov, Вы писали:
V>> Я проверял. Не твой код конечно, но все же. При общении с БД скорость V>> кода уже не так важна.
AS>Я бы не стал так говорить.
А зря. Скорость обращения к БД на несколько порядков ниже скорости работы кода. На твоей задачке даже между ассемблером и JScript разницы не будет.
V>> Так может, у тебя что-то с алгоритмом было нета? Или ты где-то память V>> удерживал?
AS>А как можно память удерживать?
Оставлять ссылки
AS>Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу AS>особо к стилю не привязываться.
[skip]
Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой соединения закрывать будет? Бедный MSSQL, это ж ему несколько тысяч соединений одновременно пришлось держать. Как еще у тебя вобще что то работало. V>> Правильно пиши на плюсах. А то что за работа конторы без периодических AS>AV
AS>AV ловят криворукие программеры и новички. AS>У меня, последние AV, с которыми я трахался, были связаны с багами в ATL. AS>Все! AS>Писать на плюсах просто надо уметь.
Hello, AndrewVK!
You wrote on Thu, 28 Aug 2003 06:00:33 GMT:
хъ
A> А зря. Скорость обращения к БД на несколько порядков ниже скорости A> работы кода. На твоей задачке даже между ассемблером и JScript разницы A> не будет.
На VBS не проверял, но думаю, что это по быстрее получится.
хъ
A> Оставлять ссылки
Это как?
хъ
A> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой A> соединения закрывать будет?
Во-первых, почему во множественном числе?
Во-вторых, зачем его закрывать? Программа завершится, оно и закроется.
A> Бедный MSSQL, это ж ему несколько тысяч соединений одновременно пришлось A> держать.
С чего ты взял?
A> Как еще у тебя вобще что то работало.
Ты свой код сначала покажи, прежде чем мой работающий хаять.
Здравствуйте, Alexey Shirshov, Вы писали:
A>> не будет.
AS>На VBS не проверял, но думаю, что это по быстрее получится.
Ну по сравнению с твоим кодом конечно быстрее.
A>> Оставлять ссылки
AS>Это как?
А вот так. Добавил какой нибудь объект в глобальную коллекцию и забыл его оттуда выкинуть по ненадобности. Или подписался на событие, а по пропаданию надобности забыл отписаться.
A>> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой A>> соединения закрывать будет?
AS>Во-первых, почему во множественном числе?
Где множественное число?
A>> Как еще у тебя вобще что то работало.
AS>Ты свой код сначала покажи, прежде чем мой работающий хаять.
Ну хорошо. Несколько комментариев
1) Во первых смысл параметра @sd мне понять не удалось, поскольку он всегда пустая строка. Я его просто выкинул.
2) О содержимом хранимок остается только догадываться, поэтому я выкинул возврат в результате ошибок. Мои хранимки такие:
3) recursive у тебя нигде не используется, но по смыслу я догадался о чем речь и реализовал
4) Атрибута Normal не существует, это отсутствие атрибутов
5) Перечисление FileAttributes флаговое, просто сравнивать, как это делаешь ты, нельзя, результат при наличии нескольких атрибутов будет неверным.
6) Записывать в одну и ту же строку значения двумя запросами, да еще и с поиском во втором запросе, да еще и в разных транзакциях просто глупо, производительность снизится в несколько раз.
using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
namespace DotNetTest
{
public class App
{
private const string _conStr = "Integrated Security=SSPI;Initial Catalog=Test";
private static int _totalProcessed = 0;
public static void Main(string[] args)
{
string path;
bool recursive;
try
{
path = args[0];
recursive = bool.Parse(args[1]);
}
catch
{
throw new ArgumentException("Invalid command line arguments");
}
DirectoryInfo dirInfo = new DirectoryInfo(path);
if (!dirInfo.Exists)
throw new DirectoryNotFoundException(path);
Console.WriteLine("Processing directory '{0}' {1}", path, recursive ? "recursive" : "");
int st = Environment.TickCount;
ProcessDir(dirInfo, recursive, -1, "");
st = Environment.TickCount - st;
Console.WriteLine("Processed {0} files in {1}", _totalProcessed, TimeSpan.FromMilliseconds(st));
Console.Read();
}
private static void ProcessDir(DirectoryInfo dirInfo, bool recursive, int parent, string shift)
{
_totalProcessed++;
int dirId;
string prefix = shift + dirInfo.FullName + " ";
using (SqlConnection con = new SqlConnection(_conStr))
using (SqlCommand cmd = new SqlCommand("create_dir", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction =
ParameterDirection.Output;
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 1000).Value = dirInfo.FullName;
cmd.Parameters.Add("@parent", SqlDbType.Int).Value = parent;
AddFileInfo(cmd.Parameters, dirInfo);
con.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(prefix + " error: " + ex.Message);
return;
}
dirId = (int)cmd.Parameters["@return_value"].Value;
Console.WriteLine(prefix + "insert directory with id = " + dirId);
}
foreach (FileInfo fileInfo in dirInfo.GetFiles())
ProcessFile(fileInfo, dirId, shift + " ");
if (recursive)
foreach (DirectoryInfo subDirInfo in dirInfo.GetDirectories())
ProcessDir(subDirInfo, recursive, dirId, shift + " ");
}
private static void ProcessFile(FileInfo fileInfo, int dirId, string shift)
{
_totalProcessed++;
string prefix = shift + fileInfo.FullName + " ";
using (SqlConnection con = new SqlConnection(_conStr))
using (SqlCommand cmd = new SqlCommand("create_file", con))
{
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@return_value", SqlDbType.Int).Direction =
ParameterDirection.Output;
cmd.Parameters.Add("@name", SqlDbType.NVarChar, 1000).Value = fileInfo.FullName;
cmd.Parameters.Add("@parent", SqlDbType.Int).Value = dirId;
AddFileInfo(cmd.Parameters, fileInfo);
AddFileAttributes(cmd.Parameters, fileInfo);
cmd.Parameters.Add("@file_size", fileInfo.Length);
con.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
Console.WriteLine(prefix + " error: " + ex.Message);
return;
}
int fileId = (int)cmd.Parameters["@return_value"].Value;
Console.WriteLine(prefix + "insert file with id = " + fileId);
}
}
private static void AddFileInfo(SqlParameterCollection prms, FileSystemInfo fsi)
{
prms.Add("@creation_time", fsi.CreationTime);
prms.Add("@last_access_time", fsi.LastAccessTime);
prms.Add("@last_write_time", fsi.LastWriteTime);
}
private static void AddFileAttributes(SqlParameterCollection prms, FileSystemInfo fsi)
{
prms.Add("@attr_archive", (fsi.Attributes & FileAttributes.Archive) > 0);
prms.Add("@attr_compressed", (fsi.Attributes & FileAttributes.Compressed) > 0);
prms.Add("@attr_encrypted", (fsi.Attributes & FileAttributes.Encrypted) > 0);
prms.Add("@attr_hidden", (fsi.Attributes & FileAttributes.Hidden) > 0);
prms.Add("@attr_readonly", (fsi.Attributes & FileAttributes.ReadOnly) > 0);
prms.Add("@attr_system", (fsi.Attributes & FileAttributes.System) > 0);
}
}
}
Результат по моему program files на Cel1800 512M и Barracuda ATA 5:
Processed 45328 files in 00:02:20.8430000
Никаких замедлений и подтормаживаний не замечено. Представить себе каталог, который будет обрабатываться 5-6 часов я не в состоянии. Так что, как видишь, виноват не дотнет.
Hello, AndrewVK!
You wrote on Thu, 28 Aug 2003 12:40:36 GMT:
[]
A>>> Ну батенька, у нас за такое премии лишают без разговоров. Кто за собой A>>> соединения закрывать будет?
AS>> Во-первых, почему во множественном числе?
A> Где множественное число?
хъ
A> 6) Записывать в одну и ту же строку значения двумя запросами, да еще и с A> поиском во втором запросе, да еще и в разных транзакциях просто глупо, A> производительность снизится в несколько раз.
Вот тут не понял.
[код поскипан]
Переписал так. Из изменений только параметры по другому создаются.
Class CApp
Public path As String
Public recursive As Boolean
Private tabs As String
Private conn As New SqlConnection("Data Source=dcit01;User
id=fsuser;password=fsuser")
Private files As Integer = 0
Sub New(ByVal path As String, ByVal r As Boolean)
If Directory.Exists(path) Then
MyClass.path = path
recursive = r
conn.Open()
Else
Throw New DirectoryNotFoundException()
End If
End Sub
Public Function Process() As Integer
Return Process(path)
End Function
Private Function Process(ByVal path As String) As Integer
Dim cmd As New SqlCommand()
Dim b As Boolean
Dim oldtabs As String'prepare to call CreateFolder stored procedureWith cmd
.Parameters.Add("@return_value", SqlDbType.Int).Direction =
ParameterDirection.ReturnValue
.Parameters.Add("@name", SqlDbType.NVarChar, 1000).Value =
path
.Parameters.Add("@sd", SqlDbType.Text).Value = ""
.Parameters.Add("@parent", SqlDbType.Int).Value = 0
.CommandText = "CreateFolder"
.CommandType = CommandType.StoredProcedure
.Connection = conn
Try'calling
.ExecuteNonQuery()
files += 1
Catch e As SqlException
b = True
Console.WriteLine(tabs & path & vbTab & " - error
message: " & e.Message)
End Try
End With'process the result and go nextIf Not b Then
Dim s As String
Dim retval As Integer =
Convert.ToInt32(cmd.Parameters(0).Value)
If retval > 0 Then
s = tabs & path & vbTab & " - inserts under " &
retval.ToString()
Else
s = tabs & path & vbTab & " - error code " &
retval.ToString()
End If'write the result to the console
Console.WriteLine(s)
If retval > 0 Then
Dim di As New DirectoryInfo(path)
Dim fi As FileInfo
Dim dir As DirectoryInfo
'update directory time attributes
UpdateFileInfo(di, retval)
tabs += " "Dim FolderId As Integer = retval
cmd.Parameters.Add("@aid", SqlDbType.Int)
'fill the files to DBFor Each fi In di.GetFiles()
With cmd
.Parameters("@name").Value = fi.FullName
.Parameters("@sd").Value = ""
.Parameters("@parent").Value = FolderId
.Parameters("@aid").Value = _
UpdateFileAttributes(fi.Attributes, fi.Name)
.CommandText = "CreateFile"Try
.ExecuteNonQuery()
files += 1
Catch e As SqlException
b = True
Console.WriteLine(tabs & fi.Name & vbTab &
" - error message: " & e.Message)
End Try
End With'process the resultIf Not b Then
retval =
Convert.ToInt32(cmd.Parameters(0).Value)
If retval > 0 Then
s = tabs & fi.Name & vbTab & " - inserts
under " & retval.ToString()
Else
s = tabs & fi.Name & vbTab & " - error code
" & retval.ToString()
End If
Console.WriteLine(s)
If retval > 0 Then
Dim cmd1 As New SqlCommand()
UpdateFileInfo(fi, retval)
With cmd1
.Parameters.Add("@fs",
SqlDbType.BigInt).Value = fi.Length
.Parameters.Add("@id",
SqlDbType.Int).Value = retval
.CommandText = "update RealFile set
FileSize=" & _
"@fs where id = @id"
.Connection = conn
.CommandType = CommandType.Text
Try
.ExecuteNonQuery()
Catch e As SqlException
Console.WriteLine(tabs & fi.Name &
vbTab & " - error message: " & e.Message)
End Try
End With'cmd1.Dispose()End If
End If
Next'cmd.Dispose()For Each dir In di.GetDirectories()
oldtabs = tabs
Process(dir.FullName)
tabs = oldtabs
Next
End If
End If'cmd.Dispose()Return files
End Function
Private Sub UpdateFileInfo(ByVal fsi As FileSystemInfo, ByVal id As
Integer)
Dim cmd As New SqlCommand()
With cmd
.Parameters.Add("@c", SqlDbType.DateTime).Value =
fsi.CreationTime
.Parameters.Add("@a", SqlDbType.DateTime).Value =
fsi.LastAccessTime
.Parameters.Add("@w", SqlDbType.DateTime).Value =
fsi.LastWriteTime
.Parameters.Add("@id", SqlDbType.Int).Value = id
.CommandText = "update FileBase set " & _
"CreationTime = @c," & _
"LastAccessTime = @a," & _
"LastWriteTime = @w where id = @id"
.CommandType = CommandType.Text
.Connection = conn
Try
.ExecuteNonQuery()
Catch e As SqlException
Console.WriteLine(tabs & fsi.Name & vbTab & " - error
message: " & e.Message)
End Try
End With'cmd.Dispose()End Sub
Private Function UpdateFileAttributes(ByVal fa As FileAttributes,
ByVal fname As String) As Integer
Dim cmd As New SqlCommand()
With cmd
.Parameters.Add("@a", SqlDbType.Bit).Value = CBool(fa And
fa.Archive)
.Parameters.Add("@c", SqlDbType.Bit).Value = CBool(fa And
fa.Compressed)
.Parameters.Add("@e", SqlDbType.Bit).Value = CBool(fa And
fa.Encrypted)
.Parameters.Add("@h", SqlDbType.Bit).Value = CBool(fa And
fa.Hidden)
.Parameters.Add("@n", SqlDbType.Bit).Value = CBool(fa And
fa.Normal)
.Parameters.Add("@r", SqlDbType.Bit).Value = CBool(fa And
fa.ReadOnly)
.Parameters.Add("@s", SqlDbType.Bit).Value = CBool(fa And
fa.System)
.Parameters.Add("@id", SqlDbType.Int).Direction =
ParameterDirection.Output
.CommandText = "AddAttr"
.CommandType = CommandType.StoredProcedure
.Connection = conn
Try
.ExecuteNonQuery()
Catch e As SqlException
Console.WriteLine(tabs & fname & vbTab & " - error
message: " & e.Message)
End Try
End With
UpdateFileAttributes =
Convert.ToInt32(cmd.Parameters("@id").Value)
'cmd.Dispose()End Function
End Class
Dispose специально закоментировал, так как без него быстрее. Получилось на
папке temp 51 файл в секунду. Что очень не плохо.
Неужели все дело было в дополнительных объектаз-параметрах, которые не
убивались?
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Я бы не стал так говорить.
Не говори.
А я за свои слова отвечаю.
AS>Про vb6 никто ничего не говорил.
Что про него говорить то? Это самое часто используемое средство (в прошлом) для создания морд к БД.
AS>А как можно память удерживать?
Ну, ты сам пример привел. Рекурсия с оставлением ссылок в стеке.
AS>Ничего тормозить не будет.
Еще как будет.
AS>К тому же, память програмулиной вообще, AS>практически, не жралась.
Ну, это другой вопрос. Если дело не в памяти, то нужно искать другую ошибку.
AS>Ок. Вот код. Только он очень старый (еще зимой писанный), так что прошу AS>особо к стилю не привязываться.
Нда. Много.
AS>AV ловят криворукие программеры и новички.
Т.е. ты никогда не ловил? Или то тоже...
AS>У меня, последние AV, с которыми я трахался, были связаны с багами в ATL. AS>Все!
Больше небыло? Ай-йа-йа. Ну, это потому что ты свой код не запускаешь. Мы тут запустили код к твоей статье про печать в ВТЛ, и ты представляешь (?) поймали тот самый AV. Наверно мы криворукие.
AS>Писать на плюсах просто надо уметь.
Ну, учись.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>На VBS не проверял, но думаю, что это по быстрее получится.
Гы-гы.
A>> Оставлять ссылки
AS>Это как?
Ну, вот так например:
Private Sub Process(ByVal path As String)
Dim cmd As New SqlCommand()
Правильным решением тут было бы сделать процедуру обработки отдельной. Т.е. чтобы рекурсивная процедура вызывала Process, а сама в сете держала по минимуму. Но не думаю, что SqlCommand может занять много памяти.
AS>Во-вторых, зачем его закрывать? Программа завершится, оно и закроется.
Она кстати не закроется. Если толтько ВБ не помежет (что вряд ли). Но серверу на это чихать.
AS>Ты свой код сначала покажи, прежде чем мой работающий хаять.
Да все у тебя с коннекшеном нормально. Это он к ВБ не привык.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>Представить себе каталог, который будет обрабатываться 5-6 часов я не в состоянии. Так что, как видишь, виноват не дотнет.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Ну в общем прошло уже несколько больше года. Да и ладно уж "крупные". Хотя бы один пример коммерческого проекта под дотнет "широкого" масштаба.
Насколько широкого масштаба? Что какой нибудь WinRar ждешь дотнетовский или ErWin. Такие тиражные продукты имеют долгую историю с постепенными переходами от версии к версии, так просто не перескочишь на дотнет.
А так дотнетизируемся все равно потихоньку на новых продуктах. Мы вот внесли свой вклад, московскую "Планету фитнес" задотнетизировали недавно. Не широкомасштабный продукт, но несколько десятков рабочих мест, ну может сотня будет. Именно настольные клиенты, зачем юзерам мучаться с броузерами, проще один раз фреймворк установить. А альтернативы и небыло для настольной части кроме как WinForms, на чем еще можно быстро реализовать механизм полуавтоматического строгания сотни навороченых форм. Очень малыми силами делался проект. И к тому же махом привинчивались фсякие аппаратные фичи типа цифровых фотокамер, читалок смарткарт.
Сейчас еще один проект делаем для них, естейственно на дотнете. В нем вобще интерфейсная часть навороченая, полностью все рисованое начиная со скролбаров с полупрозрачными ползунками и кончая таблицами.
В графике тоже альтернатив не видно — дотнет и GDI+ в этом деле рулят. Теоретически GDI+ тормозной, а на практике это никак не сказывается, так получается что не возникает ситуаций что надо одновременно весь экран перерисовывать со скоростью 40 кадров в секунду. Да ни начем больше это не сделаешь, не тратить же один человеко/год на разработку рисованых контролов.
Так что дотнет вещь очень юзабельная, дай ему только время развернуться.
Re[25]: Массивы в C#
От:
Аноним
Дата:
28.08.03 19:45
Оценка:
А я вот создал новый пустой проект, хотел потестить, скопировал второй листинг, а он не пашет — выдаёт ошибку вот в этой строке —
Hello, VladD2!
You wrote on Thu, 28 Aug 2003 18:38:03 GMT:
хъ
V> Больше небыло? Ай-йа-йа. Ну, это потому что ты свой код не запускаешь. V> Мы тут запустили код к твоей статье про печать в ВТЛ, и ты представляешь V> (?) поймали тот самый AV. Наверно мы криворукие.
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Dispose специально закоментировал, так как без него быстрее. Получилось на AS>папке temp 51 файл в секунду. Что очень не плохо.
Ну судя по моим результатам 45328/140.84 получается примерно 322 файла в секунду. На самом деле это даже заниженая цифра, поскольку в момент теста я еще и сообщения в янусе читал. Так что зря ты диспозы повыкидывал.
AS>Неужели все дело было в дополнительных объектаз-параметрах, которые не AS>убивались?
Скорее в том что работа с одним коннекшеном вобще без диспозов любых объектов оставляет какие то ресурсы mssql неосвобожденными. Надо было глядеть память не программы а mssql и смотреть его счетчики.
Здравствуйте, VladD2, Вы писали:
AVK>>Представить себе каталог, который будет обрабатываться 5-6 часов я не в состоянии. Так что, как видишь, виноват не дотнет.
VD>Подъезжай как-нить покажу.
320 файлов/сек. 6ч * 3600 = 21600 сек. Примерно 7 миллионов файлов! Ты ничего не путаешь?
Здравствуйте, <Аноним>, Вы писали:
А>А я вот создал новый пустой проект, хотел потестить, скопировал второй листинг, а он не пашет — выдаёт ошибку вот в этой строке — А>
А>DirectoryInfo dirInfo = new DirectoryInfo(path);
А>
Ошибка какая? Может ты параметры в командной строке не задал? Нужно первым параметром путь к каталогу, а вторым true для рекурсивного разбора или false для разбора только верхнего уровня.
Здравствуйте, VladD2, Вы писали:
_>>А если еще и команды заготовить заранее, а в цикле только задавать значения параметров? VD>Получишь пару процентов выигрыша.
Может, и меньше — SqlCommand не держит unmanaged-ресурсов. Но практика полезная, при использовании OleDbCommand каждое создание команды по сравнению с повторным использованием — вызов IDBCreateCommand.CreateCommand и байндинг параметров заново.
Hello, AndrewVK!
You wrote on Fri, 29 Aug 2003 06:20:35 GMT:
AS>> Dispose специально закоментировал, так как без него быстрее. AS>> Получилось на папке temp 51 файл в секунду. Что очень не плохо.
A> Ну судя по моим результатам 45328/140.84 получается примерно 322 файла в A> секунду. На самом деле это даже заниженая цифра, поскольку в момент A> теста я еще и сообщения в янусе читал. Так что зря ты диспозы A> повыкидывал.
Раскоментировал диспозы и запустил на папке program files. Там у меня
примерно 68 тыс. файлов. Первые несколько минут работало все шустро, но
потом — опять тормоза. Машинка у меня не сильная: Celeron 950, 256 Mb.
Поставил счетчики на все, что можно (уже потом, когда конкретно все
тормозило). SQL Server не тормозит, с ним все пучком. память не растет и
вообще все стабильно.
Меня больше заинтересовали счетчики .net memory
Ситуация такая: первое поколение все время растет. 0 поколение стабильно и
не растет почти всегда. Иногда скачок в нем приводит к увеличению 1
поколения, после чего в 0 поколении все нормализуется. Вместе с 1 поколением
растет, естественно bytes in heap.
Потом, когда 1 поколение уж очень сильно нахапает памятухи оно собирается и
увеличивается второе поколение (вообще-то оно постоянно увиличивается, но по
тихоньку). Очень сильно увеличивается только в момент сбора в первом
поколении.
Короче, лик очевидный.
Но где?
Здравствуйте, Alexey Shirshov, Вы писали:
AS>Раскоментировал диспозы и запустил на папке program files. Там у меня AS>примерно 68 тыс. файлов. Первые несколько минут работало все шустро, но AS>потом — опять тормоза.
Вывод — не те диспозы . У меня ведь не тормозит. Ищи причину дальше.
AS> Машинка у меня не сильная: Celeron 950, 256 Mb.
Ну не намного хуже моей.
AS>Короче, лик очевидный. AS>Но где?
Здравствуйте, AndrewVK, Вы писали:
_>>Может, и меньше — SqlCommand не держит unmanaged-ресурсов. AVK>А если Prepare() позвать?
Тогда команда будет держаться в памяти до закрытия соединения. Ну разве что можно изменить текст или параметры и выполнить заново, что вызовет Unprepare, но это извращение.
Кстати, Dispose у SqlCommand вообще не используется.
Hello, AndrewVK!
You wrote on Fri, 29 Aug 2003 09:11:22 GMT:
хъ
Короче, залил я эти файлы: Process 75113 files in 02:56:01.6160000.
Я не понимаю, в чем отличия твоего кода от моего, кроме переоткрытия
соединени каждый раз в фунции Process.
With best regards, Alex Shirshov.
Posted via RSDN NNTP Server 1.7 beta
Re[27]: Массивы в C#
От:
Аноним
Дата:
29.08.03 22:51
Оценка:
AVK>Ошибка какая? Может ты параметры в командной строке не задал? Нужно первым параметром путь к каталогу, а вторым true для рекурсивного разбора или false для разбора только верхнего уровня.
Теперь ошибка такая "An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in system.data.dll Additional information: System error." в строке:
try
{
cmd.ExecuteNonQuery();
}
видать Sql не подключен. Извеняюсь — не скажете как его подрубить?
Здравствуйте, Alexey Shirshov, Вы писали:
V>> Больше небыло? Ай-йа-йа. Ну, это потому что ты свой код не запускаешь. V>> Мы тут запустили код к твоей статье про печать в ВТЛ, и ты представляешь V>> (?) поймали тот самый AV. Наверно мы криворукие.
AS>Где?
Вообще-то тебе было об этом сказано и ты вроде даже поправил. Но факт есть факт.
AS>Приводи ошибку, посмотрим, кто виноват.
Если не ошибаюсь это был вот этот код:
//Получение хэндла принтера по умолчанию
HANDLE hPrinter;
DWORD dwSz = 0x100;
DWORD dwLastErr = -1;
PTSTR pBuf = 0;
while (!GetDefaultPrinter(pBuf,&dwSz))
{
dwLastErr = GetLastError();
if (dwLastErr == ERROR_INSUFFICIENT_BUFFER){
if (pBuf) delete[] pBuf;
pBuf = new TCHAR[dwSz];
dwLastErr = ERROR_SUCCESS;
}
else break;
}
if (dwLastErr == ERROR_SUCCESS){
OpenPrinter(pBuf, &hPrinter, NULL);
}
if (pBuf) delete[] pBuf;
// Получение структуры PRINTER_INFO_2 для данного хэндла
LPBYTE pBufpi = 0;
DWORD dwSzNeeded = 0;
dwLastErr = -1;
while (!GetPrinter(hPrinter,2,pBufpi,dwSzNeeded,&dwSzNeeded))
{
dwLastErr = GetLastError();
if (dwLastErr == ERROR_INSUFFICIENT_BUFFER){
if (pBufpi) delete[] pBufpi;
pBufpi = new BYTE[dwSzNeeded];
dwLastErr = ERROR_SUCCESS;
}
else break;
}
if (dwLastErr == ERROR_SUCCESS){
LPPRINTER_INFO_2 pPI = (LPPRINTER_INFO_2)pBufpi;
// Работаем со структурой
HDC hDC = CreateDC(NULL, pPI->pPrinterName, NULL, pPI->pDevMode);
// Работаем с контекстом
// Удаляем контекст
DeleteDC(hDC);
}
if (pBufpi) delete[] pBufpi;
На пашине с Вынь Сервер 2003 без установленных принтреров был АВ. На всех остальных был ассерт об использовании не инициализированной переменной hPrinter. Но С++ тут конечно непричем. Тут проверки написаны через задницу.
В общем, как бы кто крут не был, но позвлять себе других тоже уважать нужно. Ну, или хоть смайлики ставь.
Тут многие не глупее тебя, а многие и умнее.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, AndrewVK, Вы писали:
AVK>320 файлов/сек. 6ч * 3600 = 21600 сек. Примерно 7 миллионов файлов! Ты ничего не путаешь?
Каталог диска открывается только 5 минут. Файлов там не 7 миллионов и но компиляция chm-а идет где-то два часа. И это только один каталог, а таких у нас на некоторых машинах хватает.
... << RSDN@Home 1.1 beta 1 >>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Hello, VladD2!
You wrote on Fri, 29 Aug 2003 23:35:35 GMT:
[поскипанный код не относится к последней статье]
V> На пашине с Вынь Сервер 2003 без установленных принтреров был АВ. На V> всех остальных был ассерт об использовании не инициализированной V> переменной hPrinter. Но С++ тут конечно непричем. Тут проверки написаны V> через задницу.
Согласен. Но заметь, код я сразу же, без разговоров переписал. Но ошибка
была и я ее признаю.
V> В общем, как бы кто крут не был, но позвлять себе других тоже уважать V> нужно. Ну, или хоть смайлики ставь. Тут многие не глупее тебя, а многие V> и умнее.
Здравствуйте, <Аноним>, Вы писали:
А>Теперь ошибка такая "An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in system.data.dll Additional information: System error." в строке: А>видать Sql не подключен. Извеняюсь — не скажете как его подрубить?
Установить MSSQL Server, создать базу Test, в ней табличку files и две ХП, текст которых я приводил. Состав полей таблички можно увидеть по второй ХП.
Сделал без записи на сервер, чтоб отделить скорость собственно .NET и "скорость работы Алексея с ADO.NET". Код специально совершенно неоптимальный, в скриптовом стиле. Чтоб было видно, что дотнет и такое стерпит.
Даже свойства FileInfo лень было смотреть в документации, просто перебираю через Reflection. Остальное в том же духе.
Средняя скорость перебора даже со всеми этими тормозами — 490 файлов в секунду.
D:\Program Files
17:51:11
Total time: 139.0 sec, 68213 files, 490.6 by sec.
Присоединяюсь к мнению AVK. Дайте мне такой винчестер, чтоб там такой перебор работал пять часов. Я таких объёмов ещё в руках не держал.
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Threading;
class Run
{
static readonly string rootPath=
Path.GetPathRoot( System.Environment.SystemDirectory )+"Program Files";
static ArrayList files=new ArrayList();
static bool complete=false;
static void Main()
{
Console.WriteLine( rootPath );
DateTime start=DateTime.Now;
Console.WriteLine( start.ToLongTimeString() );
// Чтобы красиво отпечатывать прогресс, запустим-ка его в отдельном потоке...new ThreadStart( asyncMain ).BeginInvoke( null, null );
while( !complete )
{
// Собственно, прогресс
DateTime startSecond=DateTime.Now;
int startSecondCount=files.Count;
Thread.Sleep(1000);
if( files.Count>0 )
{
Console.Write(
"\r"+
(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( (files.Count-startSecondCount)/(DateTime.Now-startSecond).TotalSeconds ).ToString("0.0")+" by sec..." );
}
}
// Итоги
Console.WriteLine(
"\rTotal time: "+(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( files.Count/(DateTime.Now-start).TotalSeconds ).ToString("0.0")+" by sec." );
Console.Write( "show random..." ); Console.ReadLine();
// Чтоб никто не сомневался, выводим три случайных файла из набора
Console.WriteLine( "\nRandom files:\n" );
Random rnd=new Random();
for( int i=0; i<3; i++ )
{
Console.WriteLine( files[rnd.Next(files.Count)] );
}
Console.Write( "quit..." ); Console.ReadLine();
}
static void asyncMain()
{
try
{
addFiles(rootPath);
}
catch( Exception e )
{
Console.WriteLine( e );
}
finally
{
complete=true;
}
}
static void addFiles(string folder)
{
foreach( string dir in Directory.GetDirectories(folder) )
{
// Единственное аккуратное место во всей программе -
// объекты DirectoryInfo не уходят в "лавину рекурсии".
// В стеке только строки.
addFiles( Path.Combine(folder,dir) );
}
foreach( string file in Directory.GetFiles(folder) )
{
FileInfo fsi=new FileInfo(
Path.Combine(folder,file) );
// Нам StringBuilder ни к чему. Мы не торопимся.string fileStr=file+"\n";
// А фиг ли этот MSDN. Всё и так в метаданных прописано.
// И кешировать typeof(FileInfo), кстати, тоже не будем.foreach( PropertyInfo prop in fsi.GetType().GetProperties() )
{
fileStr+=
"\t"+prop.Name+": "+prop.GetValue(fsi,null)+"\n";
}
files.Add(fileStr);
}
}
}
Сделал без записи на сервер, чтоб отделить скорость собственно .NET и "скорость работы Алексея с ADO.NET". Код специально совершенно неоптимальный, в скриптовом стиле. Чтоб было видно, что дотнет и такое стерпит.
Даже свойства FileInfo лень было смотреть в документации, просто перебираю через Reflection. Остальное в том же духе.
Средняя скорость перебора даже со всеми этими тормозами — 490 файлов в секунду.
D:\Program Files
17:51:11
Total time: 139.0 sec, 68213 files, 490.6 by sec.
Присоединяюсь к мнению AVK. Дайте мне такой винчестер, чтоб там такой перебор работал пять часов. Я таких объёмов ещё в руках не держал.
using System;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Threading;
class Run
{
static readonly string rootPath=
Path.GetPathRoot( System.Environment.SystemDirectory )+"Program Files";
static ArrayList files=new ArrayList();
static bool complete=false;
static void Main()
{
Console.WriteLine( rootPath );
DateTime start=DateTime.Now;
Console.WriteLine( start.ToLongTimeString() );
// Чтобы красиво отпечатывать прогресс, запустим-ка его в отдельном потоке...new ThreadStart( asyncMain ).BeginInvoke( null, null );
while( !complete )
{
// Собственно, прогресс
DateTime startSecond=DateTime.Now;
int startSecondCount=files.Count;
Thread.Sleep(1000);
if( files.Count>0 )
{
Console.Write(
"\r"+
(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( (files.Count-startSecondCount)/(DateTime.Now-startSecond).TotalSeconds ).ToString("0.0")+" by sec..." );
}
}
// Итоги
Console.WriteLine(
"\rTotal time: "+(DateTime.Now-start).TotalSeconds.ToString("0.0")+" sec, "+
files.Count+" files, "+
( files.Count/(DateTime.Now-start).TotalSeconds ).ToString("0.0")+" by sec." );
Console.Write( "show random..." ); Console.ReadLine();
// Чтоб никто не сомневался, выводим три случайных файла из набора
Console.WriteLine( "\nRandom files:\n" );
Random rnd=new Random();
for( int i=0; i<3; i++ )
{
Console.WriteLine( files[rnd.Next(files.Count)] );
}
Console.Write( "quit..." ); Console.ReadLine();
}
static void asyncMain()
{
try
{
addFiles(rootPath);
}
catch( Exception e )
{
Console.WriteLine( e );
}
finally
{
complete=true;
}
}
static void addFiles(string folder)
{
foreach( string dir in Directory.GetDirectories(folder) )
{
// Единственное аккуратное место во всей программе -
// объекты DirectoryInfo не уходят в "лавину рекурсии".
// В стеке только строки.
addFiles( Path.Combine(folder,dir) );
}
foreach( string file in Directory.GetFiles(folder) )
{
FileInfo fsi=new FileInfo(
Path.Combine(folder,file) );
// Нам StringBuilder ни к чему. Мы не торопимся.string fileStr=file+"\n";
// А фиг ли этот MSDN. Всё и так в метаданных прописано.
// И кешировать typeof(FileInfo), кстати, тоже не будем.foreach( PropertyInfo prop in fsi.GetType().GetProperties() )
{
fileStr+=
"\t"+prop.Name+": "+prop.GetValue(fsi,null)+"\n";
}
files.Add(fileStr);
}
}
}
Здравствуйте, VladD2, Вы писали:
VD>В Шарпе есть понятие массив массивов, а есть многомерный массив. Точ то ты спрашивал (про ассоциативные массивы) вообще к языку не оносится. А то, что тебе показывал АВК — это как раз массивы одномерные (временами вложенные).
Вложенные одномерные массивы и есть многомерный массив. В MSDN это зовут jagged arrays
Здравствуйте, VladD2, Вы писали:
VD>Ну, не знаю я с С++ и Дельфи за пять минут перелез. Конечно тонкости есть везде, но хэш-таблицы они и в африке хэш-таблицы (правда в Дельфи они появились только в шестерке).
Строковый хеш в пятерке был точно, а может и раньше.