2015-10-21 1 views
-1

поэтому у меня есть ListBox, и я наполнил его значениямиУдаляя элемент списка, он будет хранить его индексный номер?

hi - 0 
hello - 1 
abc - 2 
dog - 3 
cat - 4 
bear - 5 

(символ # представляет его значение индекса) Если бы я удалить запись кота - 4 будет нести иметь значение индекса 4 или сохранится ли значение 5?

+0

Если у вас уже есть, вы можете попробовать его и проверить результат .. –

+0

индексов ListBox представляют текущий индекс в списке. Если вы удалите элемент, все индексы после удаления будут изменены. В вашем примере, если вы удалите все элементы, кроме 'dog', будет только один элемент с индексом' 0'. –

+0

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

ответ

0

Нет, вышеуказанные элементы не сохранят свои старые индексы - они будут перемешаны. Это связано с тем, что они хранятся в виде связанного списка (List<T>), поэтому любой пробел в списке фактически разрушит цепочку, и любые элементы, находящиеся за «пробелом», будут недоступны.

Связанные списки работают, если каждый элемент хранит ссылку на ячейку памяти следующего (думайте, указатели, если вы знакомы с C++). Поэтому, если один элемент удален. Объект должен «восстановить» список, повторно связав элемент после удаленной с элементом раньше. Как указывалось ранее, элементы, находящиеся за удаленным элементом, были бы недоступны, если бы ссылка не была фиксированной (и фиксация ссылки означает, что элементы сдвигаются вниз).

Например, предположим, что у меня был List<T> из string с на следующих позициях индекса следующих элементов:

0 - "Bob" 
1 - "Joe" 
2 - "Bill" 

Как это работает в том, что Боб будет содержать ссылку на Джо, и Джо есть ссылка на Билл. Поэтому, когда вы обращаетесь к индексу, вызывается рекурсивный алгоритм, начиная с 0 (Боб) и получая ссылку на следующий элемент. Этот процесс повторяется дважды для индекса из двух (получить ссылку Боба (Joe), а затем получить ссылку на это (Билл), который является вашим индексом два). Это не было бы вообще для индекса 0, потому что 0 является стартовым элементом, поэтому он просто вернет это.

Это последний бит не было на самом деле отношения к вашему вопросу, но, надеюсь, вы узнали что-то новое :)

+0

'Список ' не является «связанным списком». Описывать его как таковое просто сбивает с толку. –

+0

О, мои извинения - я думал, что это связанная структура списка! Спасибо, что поняли это; что именно вы знаете? –

+0

Из [документации] (https://msdn.microsoft.com/en-us/library/6sh2ey19 (v = vs.110) .aspx): _ «Он реализует общий интерфейс IList , используя массив, размер которого динамически увеличивается по мере необходимости ». _ –

-2
var listArray = yourListbox.items 

foreach(var iem in listArray) 
{ 
    Console.WriteLine(item.ToString()); 
} 
+1

Я знаю, что вы предполагаете, что OP должен проверить свой вопрос, и вы правы, но думаете ли вы, что можете объяснить это в своем ответе? Кроме того, чтобы не быть слишком педантичным, но я думаю, что 'var iem' предназначен для' var item';) –

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