2013-09-11 2 views
1

Я использую VB.net (очень старые версии) довольно долгое время, но не в последние 7-8 лет. У меня есть VS 2012 и .net 4.5, и ясно, что они добавили головокружительный массив (не предназначенный для каламбур) коллекций. Я читал и читал в сети, но я действительно более смущен, чем раньше., какой тип коллекции использовать в .NET 4.5?

Я хотел бы получить рекомендации относительно того, какой тип коллекции использовать.

У меня есть CAD объекты, которые имеют: дескриптор (шестнадцатеричную текстовую строка до 16 символов) начальной точки (пользовательский объект с X, Y и Z координат) (необязательно) конечной точки (а пользовательский объект с X, Y и Z координат)

для моих целей здесь я хочу, чтобы иметь возможность получать (и удалять) все объекты, которые разделяют определенную ручку или определенный начальный или конечный пункт:

if handle = 345 OR 
if point = start point OR 
if point = end point 

Я ожидаю иметь до нескольких тысяч сущностей и будет «цепляю» их. То, что я подразумеваю под цепочкой, - это собрать тогда в «цепочке» от конца до конца. Я получаю от одного до многих фрагментов сущностей, которые образуют цепочку.

У меня есть разработанная логика, которая передает коллекцию сущностей только один раз и приводит к скованному результату. Это зависит от выполнения поиска с использованием вышеприведенных критериев.

Edit ... чрезвычайно упрощенные фактические данные могут выглядеть следующим образом:

Handle: 110 
Start point x: 23.17 
Start point y: 18.29 
End point x: 32.5 
End point y: 30.72 

Handle: 111 
Start point x: 40.12 
Start point y: 18.32 

Handle: 112 
Start point x: 40.12 
Start point y: 40.12 
End point x: 100.1 
End point y: 83.2 

Handle: 113 
Start point x: 40.12 
Start point y: 18.32 
End point x: 32.5 
End point y: 30.72 

Это будет в конечном итоге приковано в таком порядке:

Handle: 110 
Start point x: 23.17 
Start point y: 18.29 
End point x: 32.5 
End point y: 30.72 

Handle: 113 
Start point x: 40.12 
Start point y: 18.32 
End point x: 32.5 
End point y: 30.72 

Handle: 111 
Start point x: 40.12 
Start point y: 18.32 

Handle: 112 
Start point x: 40.12 
Start point y: 40.12 
End point x: 100.1 
End point y: 83.2 

Что коллекция бы вы vb.net специалисты рекомендуют?

+1

Коллекции.NET и не относится к VB – Paparazzi

ответ

0

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

+0

«Я также добавлю класс обертки значений, который действует как связанный список, содержащий ссылки на следующий элемент в вашей цепочке». - Не знаете, что вы имеете в виду? Я собирался создать класс с двумя свойствами: предыдущей сущностью и следующей сущностью. Это то, что вы имели ввиду? – Eric

+0

Что вы описали, это связанный список, да. – Dai

+0

Кроме того, спасибо за очень быстрый ответ. Я смотрю на пользовательский тип ключа, который переопределяет GetHashCode – Eric

0

Я думаю, вы могли бы просто использовать List (Of T).

Например:

List(Of MyCADEntry) listEntries = new List(Of MyCADEntry)(); 

, а затем использовать LINQ для таких вещей, как

listEntries.Where(Function(x) x.StartPoint == point); 
2

Это действительно зависит от того, как часто вы собираетесь удалять объекты. Если вы говорите всего несколько тысяч объектов, и вы не собираетесь удалять сотни раз в секунду, то простой LinkedList(Of Entity) действительно прост. Это дает вам вашу «цепочку».

Чтобы удалить элементы, которые соответствуют вашим критериям (мой код в C#, но, вероятно, можно перевести его достаточно легко):

chain = new LinkedList<Entity>(); 
// some code populates the linked list. 

// now, to delete 
LinkedListNode<Entity> node = chain.First; 
while (node != null) 
{ 
    LinkedListNode<Entity> nextNode = node.Next; 
    if (node.Value.handle = searchHandle || 
     node.Value.startPoint.Equals(searchStartPoint) || 
     node.Value.endPoint.Equals(searchEndPoint) 
    { 
     // remove the node 
     chain.Remove(node); 
    } 
    node = nextNode; 
} 

Вы можете сделать это с помощью List(Of Entity), но удаление будет гораздо медленнее, будет вставлять элемент в середину цепочки.

+0

Связанный список - это именно то, что мне нужно для хранения отсортированных объектов. Спасибо! – Eric

Смежные вопросы