AndrewVK,
> E>Вот в C++ для этого можно boost::multi_index применить. > > А в C# DataView.
Это несколько другое. boost::multi_index -- контейнер, аналог map (Dictionary в C#), но со многими ключами. DataView -- компонент "легкой" базы данных. Ну и, естественно, все проверки типизации в случае последнего динамические. Ну и, опять-таки, это был пример "ситуации, когда C++ может быть короче, чем Java или C#, или Ruby". Использование DataView в данном случае получится значительно длиннее (закрывая глаза на эффективность, выразительность и т.п.).
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, eao197, Вы писали:
E>Да так, интересный поворот просто. Для задачи, где требуется контейнер с упорядочением по разным полям делать, применять ADO.NET.
Здравствуйте, AndrewVK, Вы писали:
E>>Да так, интересный поворот просто. Для задачи, где требуется контейнер с упорядочением по разным полям делать, применять ADO.NET.
AVK>А что не так?
Не привычно.
Все же ADO.NET -- это для работы с БД.
Но я не возражаю -- возможно. Хотя, боюсь, будет больше кода, чем с boost::multi_index.
... << RSDN@Home 1.1.4 stable rev. 510>>
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
P.S.
>> E>Вот в C++ для этого можно boost::multi_index применить.
>> А в C# DataView.
> Это несколько другое. boost::multi_index -- контейнер, аналог map (Dictionary в C#), но со многими ключами. DataView -- компонент "легкой" базы данных. <...>
Посмотрел на последнее еще чуть поближе... Похоже, DataView/DataTable работают в терминах предустановленных типов данных, на которые придется "раскладывать" объекты своих типов, и, похоже, не позволяют задавать свои отношения порядка и т.п. В общем, если это так, то это не "несколько другое", а "совсем другое".
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, VladD2, Вы писали:
VD>Вот и получается, что в итоге привчки математиков переходят на совершенно конкретные аспекты программирования и првносят в них совершенно не нужную сложность.
Если бы программисты не забывали совсем про математику, то сложностей никаких бы не возникало.
Здравствуйте, eao197, Вы писали:
E>Не привычно. E>Все же ADO.NET -- это для работы с БД.
Это для работы с данными, а не с БД (неймспейс называется System.Data, а не System.Database). Да и использование библиотеки в шарпе не сопряжено с таким же оверхедом, как в С++.
E>Но я не возражаю -- возможно. Хотя, боюсь, будет больше кода, чем с boost::multi_index.
В принципе есть еще BindingList<T>, но он, в текущей реализации, не поддерживает индексы. В любом случае никто не мешает нам написать на шарпе близкий аналог boost::multi_index. К языкам это имеет весьма опосредованное отношение.
AndrewVK,
> В любом случае никто не мешает нам написать на шарпе близкий аналог boost::multi_index. К языкам это имеет весьма опосредованное отношение.
В данном случае значение будет иметь степень поддержки языком обобщенного программирования.
Posted via RSDN NNTP Server 2.0 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
>> В любом случае никто не мешает нам написать на шарпе близкий аналог boost::multi_index. К языкам это имеет весьма опосредованное отношение.
ПК>В данном случае значение будет иметь степень поддержки языком обобщенного программирования.
Да, но вот для обобщенных коллекций нетовских дженериков достаточно. А кодогенерации для такой коллекции не нужно.
Здравствуйте, eao197, Вы писали:
E>Я не однозначно выразился в определении задачи. Есть map<X, Y>, нужно из него получить map2, где все X сохраняют свое значение, а все Y меняют.
А по какому принципу они это делают? Ну, зачем они меняют значения? Каков алгоритм?
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Еще раз повторюсь — это плохой термин. Он сильно перегружен и воспринимается по разному.
Есть функции высшего порядка. Это функция принимющая ссылку на другую функцию. Есть ссылка на метод (упрощенно — это то же самое что делегат или указатель на функцию). Есть лябда-функции. Они же (опять же упрощенно) анонимные методы. Вот этими терминами лучше и пользоваться. А клозюр просто забудь. Тут уже задолбались спорить по поводу значения этого слова.
E>А ты никогда суточных логов по 500Mb не видел?
Месячных... годовых... но чтобы суточных. Это если только милисекунды в лог писать.
В любом случае это отдельная проблеа которую можно решить не намного сложнее.
Логи обычно содержат строки, так что можно читать и изменять файл по строкам.
E>Ага. Когда комплекс состоит из пяти процессов, которые работают на двух машинах (это пока, планируется еще большая распределенность), то просто обхахатываешься.
Ну, да при этом отладчик уже не понадбится. Все равно работать не будет.
E>Не верю. Имхо, все же становится.
Верю, не верю. Что переть против фактов то?
E>И понимать короткий код все же проще.
А вот это не факт.
E>А ведь большинство прикладных задач как раз строятся на основе использования готовых библиотек.
Тогда нужно сравнивать библиотеки, а не языки.
E>А вот пример ситуации, когда C++ может быть короче, чем Java или C#, или Ruby. Представь, что нужно прочитать оглавление каталога в контейнер чтобы затем уметь обращаться к этому контейнеру по трем индексам: по именам файлов, по дате их изменения и по имени их фладельца. Причем вставка или удаление элемента в/из контейнера должна приводить к автоматическому обновлению индексов.
E>Вот в C++ для этого можно boost::multi_index применить.
Опять таки С++ тут не причем. Это вопрос библиотеки. Выкинь буст и получишь более сложное решение.
Что касается решения на Шарпе, то твой буст тут отдыхает, так как в дотнет входит такой класс как DataTable. В нем встрена поддержка индексов и представлений. Вот наклепал на коленке за пару минут:
using System;
using System.Data;
using System.IO;
class Program
{
static void Main()
{
string path = @"c:\WINDOWS";
DirectoryInfo dir = new DirectoryInfo(path);
DataTable files = new DataTable("files");
files.Columns.Add("Name", typeof(string));
files.Columns.Add("Date", typeof(DateTime));
files.PrimaryKey = new DataColumn[] { files.Columns["Name"] };
// Создаем представление для поиска по имени
DataView nameView = new DataView(files);
nameView.Sort = "Name"; // это создаст индекс по полю "Name".
// Создаем представление для поиска по дате
DataView dateView = new DataView(files);
dateView.Sort = "Date"; // это создаст индекс по полю "Date".
// возиться с владельцем просто влом. Это не так просто.
// Но с точки зрения задачи проблем нет. Нужно бобавить еще одно предствление.
// Если нужны индексы по нескольким полям, то это тоже не проблема.foreach (FileInfo file in dir.GetFiles())
files.Rows.Add(file.Name, file.LastWriteTime);
DataRowView[] rows = nameView.FindRows("winnt256.bmp");
if (rows.Length > 0)
Console.WriteLine(rows[0]["Date"]);
rows = dateView.FindRows(
new FileInfo(Path.Combine(path, "winnt.bmp")).LastWriteTime);
foreach (DataRowView row in rows)
Console.WriteLine(row["Name"]);
}
}
Можешь ради хохмы попробовать то же саоме на С++ слабать. А потом сравнить время которое затратил, объем кода и понятность этого самого кода.
Вот только это опять таки наличие довольно крутого класса. Тоже смое можно сделать и на МС++.
E>Вот, нашел, кто запустил сюда эту информацию: http://www.rsdn.ru/Forum/?mid=588736
Ну, верь, верь. Ради хохмы мой пример (выше) запустился со второго раза. Опечатался в имени типа второй колонки. Ради хохмы реализуй аналог на С++ и посчитай сколько раз будшь компилировать/запускать.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, eao197, Вы писали:
E>>Я не однозначно выразился в определении задачи. Есть map<X, Y>, нужно из него получить map2, где все X сохраняют свое значение, а все Y меняют.
VD>А по какому принципу они это делают? Ну, зачем они меняют значения? Каков алгоритм?
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Это несколько другое. boost::multi_index -- контейнер, аналог map (Dictionary в C#), но со многими ключами.
И что дикая проблема такой написать? Просто уже есть не хуже.
ПК> DataView -- компонент "легкой" базы данных.
1. TataTable, так как DataView всего лишь средство создания представлений для TataTable.
2. Это не облегченная БД, а компонент работы с данными. Я, например, с удовольствием читаю им данные из ХМЛ-я когда они там в соотвествующем формате лежат (а это часто встречается). Кто-то получает данные из БД. А кто-то вот использует чтобы получить индексы.
ПК> Ну и, естественно, все проверки типизации в случае последнего динамические.
И? Ты просто пошуметь сюда влез? Поднимись выше и посмотри с чего это все началось:
А вот пример ситуации, когда C++ может быть короче, чем Java или C#, или Ruby. Представь, что нужно прочитать оглавление каталога в контейнер чтобы затем уметь обращаться к этому контейнеру по трем индексам: по именам файлов, по дате их изменения и по имени их фладельца. Причем вставка или удаление элемента в/из контейнера должна приводить к автоматическому обновлению индексов.
Вот в C++ для этого можно boost::multi_index применить.
ПК> Ну и, опять-таки, это был пример "ситуации, когда C++ может быть короче, чем Java или C#, или Ruby".
Это очередной пример пыпытки нечесной игры. В простонародье — мошейничества.
ПК> Использование DataView в данном случае получится значительно длиннее (закрывая глаза на эффективность, выразительность и т.п.).
А ты приведи полный код и сравним. Что до эффективности, то это просто незнание реализации. TataTable хранит данные в типизированных массивах. Индексы тоже типизированные. Скорость их работы более чем приемлема для данных хранимых в памяти.
В общем, очередная демонстрация притягивания аргументов за уши исходя из фанатизма. Нет никаких приемуществ в данной задаче у С++ и быть не может.
Давай ради хохмы усложним задачу и предложим отобразить файлы имеющие дату совподающую с некоторым в некотором диалоге. Вот тогда оверхэд и посчитаем. Для дататэйбла это будет еще строчки 4-5 кода. На С++ поре грязи.
... << RSDN@Home 1.2.0 alpha rev. 591>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Посмотрел на последнее еще чуть поближе... Похоже, DataView/DataTable работают в терминах предустановленных типов данных, на которые придется "раскладывать" объекты своих типов, и, похоже, не позволяют задавать свои отношения порядка и т.п. В общем, если это так, то это не "несколько другое", а "совсем другое".