2012-06-28 4 views
1

Я пишу какую-то программу обработки изображений, которая позволяет пользователю открывать столько изображений, сколько захочет. Каждый раз, когда пользователь открывает изображение, программа должна создать для него объект, который определен некоторым классом MyClass. Очевидно, когда я создаю этот объект в методе «открытия изображения» (например, нажав кнопку меню Файл -> Открыть ...), объект известен только в этом методе и будет бесполезен для других методов пользовательского интерфейса. Я мог бы создать массив в классе UI, а затем просто назначить объект MyClass [i] и продолжить подсчет i, но это не вариант, поскольку я не могу узнать, сколько изображений пользователь хочет открыть. Кроме того, пользователь должен снова закрыть изображения, что означает, что этот индекс i будет бесполезным.Динамическое создание и стирание объектов

Есть ли способ каким-то образом иметь набор объектов, к которым я могу добавлять и удалять объекты динамически? Объекты должны быть в состоянии идентифицировать себя в этой коллекции, скажем, имя файла.

Я совершенно новичок в C#, поэтому, пожалуйста, попробуйте объяснить все как можно подробнее.

ответ

1

Вам нужна динамическая структура данных, такая как List.

Вы можете использовать либо общий (то есть список), либо не общий (то есть список). С помощью списка вы можете динамически добавлять или вставлять элементы, определять их индексы и удалять элементы по своему усмотрению.

Размер списка увеличивается/сжимается динамически, когда вы используете операции с списками.

Пусть ваши изображения представлены как объекты типа изображения, то вы можете использовать список так:

// instantiation of an empty list 
List<Image> list = new List<Image>(); 

// create ten images and add them to the list (append at the end of the list at each iteration) 
for (int i = 0; i <= 9; i++) { 

    Image img = new Image(); 
    list.Add(img); 
} 

// remove every second image from the list starting at the beginning 
for (int i = 0; i <= 9; i += 2) { 

    list.RemoveAt(i); 
} 

// insert a new image at the first position in the list 
Image img1 = new Image(); 
list.Insert(0, img1); 

// insert a new image at the first position in the list 
IMage img2 = new Image(); 
list.Insert(0, img2); 

Альтернативный подход, используя словари:

Dictionary<string, Image> dict = new Dictionary<string, Image>(); 

for (int i = 0; i <= 9; i++) { 

    Image img = new Image(); 

    // suppose img.Name is an unique identifier then it is used as the images keys 
    // in this dictionary. You create a direct unique mapping between the images name 
    // and the image itself. 
    dict.Add(img.Name, img); 
} 

// that's how you would use the unique image identifier to refer to an image 
Image img1 = dict["Image1"]; 
Image img2 = dict["Image2"]; 
Image img3 = dict["Image3"]; 
+0

Звучит неплохо, но могу ли я локализовать объект по ключевому слову (например, по имени файла)? – phil13131

+0

№ Список, индексированный индексом, который должен быть целым числом. Если вы хотите адресовать изображения чем-то другим, кроме числового индекса, вы должны использовать словарь. Я продолжу свой ответ выше. –

+0

Спасибо, Рид Копси также предложил словарь. – phil13131

1

Вы можете сохранить объекты в Dictionary<TKey,TValue>. В этом случае вам, вероятно, понадобится Dictionary<string, MyClass>.

Это позволит вам искать и хранить элементы на основе ключа , который может быть именем файла.

+0

Когда я пытаюсь добавить словарь <строку , MyClass> в классе UI. Я получаю errormessage: «Неэквивалентный тип« System.IO.Directory »не может использоваться с аргументами типа» – phil13131

+0

@ phil13131 Добавьте 'using System.Collections.Generic;' в верхней части вашего файл ... Кроме того, это ** Словарь ** не * Каталог * ( –

+0

Он уже был включен. Может ли это иметь какое-то отношение к MyClass? Нужно ли иметь определенные свойства? – phil13131

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