2016-06-30 4 views
1

Предположим, что у меня есть LinkedList < Клиент>, и каждый объект Client имеет свойство ID. Я хочу установить идентификатор каждого клиента в соответствии со своим индексом в LinkedList.Поиск индекса элемента в LinkedList C#

В Java я использовал, чтобы сделать это, как этот

for (Client i : clientList) 
{    
    i.setClientId(clientList.indexOf(i)); 
} 

Я не могу найти функцию, эквивалентную IndexOf() в C#

+0

Я думаю, что самый большой вопрос в том, почему вы используете связанный список? Вы, вероятно, найдете более подходящим для ваших нужд с другой коллекцией. А также, почему вы хотите идентифицировать клиента с индексом в списке? Это не похоже на логическую вещь. –

+0

Я использовал коллекцию Linked List в основном из-за незнания других коллекций, поскольку главное, что я хотел, это нестационарный массив массивов. Я хочу, чтобы индекс передавался объекту Client, потому что я хочу знать, какой из них хранится первым, вторым и т. Д., Так как я хочу упорядочить их в пользовательском интерфейсе, где пользователь может изменить индекс, если захочет. – exophrenik

+0

Вы должны указать обзор типов коллекций и выбрать тот, который соответствует вашим потребностям, прежде чем использовать его. LinkedList - это то, что он есть, он связан как в -> первый объект указывает на следующий и следующий на следующий. Вы выбрали наихудший возможный список для этого, так как список не знает, где находятся объекты. - Каждый узел в объекте LinkedList имеет тип LinkedListNode .Поскольку LinkedList имеет двойную привязку, каждый узел указывает на узел Next и обратно на предыдущий узел. –

ответ

3

В Java я использовал, чтобы сделать это, как это [...]

Это медленный вариант: операция занимает O (п), потому что вы выполните линейный поиск для каждого элемента из clientList. Лучшим вариантом было бы сохранить целочисленный индекс вне цикла:

int lastId = 0; 
for (Client i : clientList) {    
    i.setClientId(lastId++); 
} 

Я не могу показаться, чтобы найти функцию, эквивалентную indexOf() в C#

Это хорошо, потому что вы можете использовать лучший вариант:

var lastId = 0; 
foreach (var c in clientList) { 
    c.ClientId = lastId++; 
} 

опцион без локальной переменной является более сложным, но здесь это все равно:

foreach (var p in clientList.Select((c, i) => new {Client=c, Index=i})) { 
    p.Client.ClientId = p.Index; 
} 
+0

* В Java я делал это так [...] * ... не вижу таких текст в вопросе? – Rahul

+0

@Rahul '[...]' обозначает текст, который был обрезан из цитаты. Все остальное - это копия/вставка из вопроса, в том числе «i» или «I». – dasblinkenlight

+0

Спасибо, я не осознавал сложность O. – exophrenik

1

Try:

int i = 0; 
foreach(Client c in clients){ 
    c.Id = i++; 
} 

IndexOf не существует в LinkedList - это связанная структура.

Поиск индекса элемента означает сравнение искомого элемента со всеми элементами. Это было бы очень неэффективно.

Предпочитаете List<Client> - LinkedList<T>, если вы не можете запустить цикл.

И если вам нужно использовать LinkedList<T>, подумайте о том, чтобы написать свою собственную функцию и иметь более низкие характеристики.

С уважением

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