Вход на сайт
С# ArrayList.BinarySearch
341
03.08.06 17:55
проблема.
Программа на с#.
есть структура. переменные этой структуры загоняются в ArrayList.
Нужно проверять при каждом ArrayList.ADD есть ли уже похожая (переменная или объект, незнаю как правильней назвать).
проверять нужно по полю структуры Name.
Я знаю, существует ArrayList.BinarySearch(Object,ICompare comparer). Это вещь не функционирует правильно, если до этого не была проведена сортировка. ArrayList.Sort(comparer). Конечно можно до каждого Add делать сортировку. Вопрос в том, стоит ли? или же простым циклом-перебором будет также или нет?
И вопрос, можно ли использовать хэш таблицу для этого, если да то как?
я имею в виду загнать ArrayList в таблицу и там сравнивать.
Подскажитн и объясните. буду очень признателен.
Программа на с#.
есть структура. переменные этой структуры загоняются в ArrayList.
Нужно проверять при каждом ArrayList.ADD есть ли уже похожая (переменная или объект, незнаю как правильней назвать).
проверять нужно по полю структуры Name.
Я знаю, существует ArrayList.BinarySearch(Object,ICompare comparer). Это вещь не функционирует правильно, если до этого не была проведена сортировка. ArrayList.Sort(comparer). Конечно можно до каждого Add делать сортировку. Вопрос в том, стоит ли? или же простым циклом-перебором будет также или нет?
И вопрос, можно ли использовать хэш таблицу для этого, если да то как?
я имею в виду загнать ArrayList в таблицу и там сравнивать.
Подскажитн и объясните. буду очень признателен.
NEW 03.08.06 18:45
в ответ JacksonB 03.08.06 17:55
Для таких вещей существует хэш-таблицы, Мурр написал как.
p.s. Не используй структуры без необходимости. Boxing / unboxing происходил бы много раз, если делать сортировку ArrayList, содержащего структуры. CompareTo принимает object, содержащийся в ArrayList, для доступа к полю Name внутри функции требуется unboxing переданного в метод объекта.
p.s. Не используй структуры без необходимости. Boxing / unboxing происходил бы много раз, если делать сортировку ArrayList, содержащего структуры. CompareTo принимает object, содержащийся в ArrayList, для доступа к полю Name внутри функции требуется unboxing переданного в метод объекта.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 04.08.06 11:08
в ответ Murr 03.08.06 18:11
значений до 300 обычно. для этого пош╦л бы простой цикл. так я и для начала и сделал.
но кто знает, их может быть и больше.
вся проблема в том что теоретически я знаю что такое хэш таблица и как сравнивать.
только как это в c# сделать. мне бы пример или ссылку почитать, если вас это не затруднит.
хотелось бы знать как это делается в программном коде.
буду очень признателен.
но кто знает, их может быть и больше.
вся проблема в том что теоретически я знаю что такое хэш таблица и как сравнивать.
только как это в c# сделать. мне бы пример или ссылку почитать, если вас это не затруднит.
хотелось бы знать как это делается в программном коде.
буду очень признателен.
NEW 04.08.06 11:13
в ответ voxel3d 03.08.06 18:45
то есть вы хотите сказать, что было бы лучше создать класс вместо структуры?
я тоже над этим думал. незнаю просто что лучше и правильней (ну и естественно и стиль программирования).
видите ли структура содержит в себе 3 подструктуры. они не большие. если вс╦ это сделать как класс, то получиться около 20 полей объекта (свойств).
вот так стою на распутье. что лучше. и сейчас и на будущее.
я тоже над этим думал. незнаю просто что лучше и правильней (ну и естественно и стиль программирования).
видите ли структура содержит в себе 3 подструктуры. они не большие. если вс╦ это сделать как класс, то получиться около 20 полей объекта (свойств).
вот так стою на распутье. что лучше. и сейчас и на будущее.
NEW 04.08.06 13:27
Между классами и структурами различие заключается в способе размещения соданных объектов, а не во внутренней организации - первое является ссылочным типом и созданные объекты размещается в хипе, а второе структурным и созданные объекты размещаются на стеке. В структуре можно иметь свойства, а в классе можно и не иметь свойств, с этой точки зрения никакой разницы между ними нет. Структуры следует использовать для легковесных объектов, для которых значимым является быстрое размещение и удаление. Структуры не следует использовать, когда происходит многократная передача структуры в метод, принимающий ссылочный тип, например, object. В этом случае всё преимущество использования структур сводится на нет за счёт "упаковки" (boxing), когда структура преобразуется в object. В данном примере мы уже имеем (если использовать структуры) в ArrayList упакованные объекты
и при вызове метода CompareTo упаковки лишней не будет. Но при обращении к полю упакованной структуры, там сравнение по полю Name идёт внутри метода, будет происходит "распаковка" (unboxing), что сведёт на нет весь смысл использования структур.
С хэш-таблицами работать просто:
С хэш-таблицами работать просто:
class MyClass
{
public string name;
}
void foo()
{
Hashtable htbl = new Hashtable();
MyClass mc = new MyClass();
MyClass mc1 = new MyClass();
mc.name = "test";
mc1.name = "test2";
htbl[mc.name] = mc;
htbl[mc.name] = mc1; // тут объект, доступный по ключу mc.name, перезапишется
htbl[mc1.name] = null; // второй элемент хэш-таблицы
object obj = htbl[521]; // obj будет равен null
htbl[null] = 354; // так нельзя, будет эксепшн
}
Всё, что тебе надо, создавать объекты и просто запихивать их в хэш-таблицу. Проверка, если нужна, заключается либо в вызове метода ContainsKey(), либо проверкой htbl[key] на null.
Dropbox - средство синхронизации и бэкапа файлов.
NEW 04.08.06 15:17
в ответ voxel3d 04.08.06 13:27
Чуток добавлю. Не нашел в Hashtable ключика UniqueOnly.
Так же не нашел в доках гарантий на уникальность добавляемых по Add() значений (по идее - должна быть) и не нашел какой из объектов будет возвращаться при дублировании. Так что приходится проверять наличие ключа перед добавлением:
if ( !htbl.ContainKey(key) )
htbl.Add(key, myValue);
Так же не нашел в доках гарантий на уникальность добавляемых по Add() значений (по идее - должна быть) и не нашел какой из объектов будет возвращаться при дублировании. Так что приходится проверять наличие ключа перед добавлением:
if ( !htbl.ContainKey(key) )
htbl.Add(key, myValue);
NEW 04.08.06 16:35
в ответ Murr 04.08.06 15:17
> Так же не нашел в доках гарантий на уникальность добавляемых по Add() значений
Плохо смотрели, в MSDN в описании этой функции указывается, какие исключения она может кидать. Там как раз написано про то, что Add добавляет только уникальные значения. (В отличии от использования индексатора, который замещает существующее значение).
Плохо смотрели, в MSDN в описании этой функции указывается, какие исключения она может кидать. Там как раз написано про то, что Add добавляет только уникальные значения. (В отличии от использования индексатора, который замещает существующее значение).
Dropbox - средство синхронизации и бэкапа файлов.
NEW 04.08.06 18:15
в ответ voxel3d 04.08.06 16:35
Смотрел действительно через строку - слишком свежо внятное описание и приведенные примеры использования Item для Hashteble.
Но сделал правильно - замена у меня, по задаче, не допускается - вместо добавляемого надо возвращать имеющееся и никаких исключений не допускается.
Хммм... Вот в голову мысля пришла - что же я буду делать, когда надо будет иметь функциональность Hastable, но с множественными ключами?
P.S. К последнему вопросу можно относиться... пятнично.

Но сделал правильно - замена у меня, по задаче, не допускается - вместо добавляемого надо возвращать имеющееся и никаких исключений не допускается.

Хммм... Вот в голову мысля пришла - что же я буду делать, когда надо будет иметь функциональность Hastable, но с множественными ключами?

P.S. К последнему вопросу можно относиться... пятнично.
