Подтвердить что ты не робот

Найти элемент в ObservableCollection без использования цикла

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

for (int i=0; i < list.Count; i++)
{
   if(title == list[i].Title)
   {
    //do something
   }
}

Как я могу получить доступ к list[i].Title без необходимости перебирать всю коллекцию? Поскольку мой список имеет тенденцию к росту, это может повлиять на производительность моей программы.

У меня есть много похожих синтаксисов в моей программе (доступ к общедоступным свойствам через цикл for и по индексу). Но я уверен, что должен быть лучший и элегантный способ сделать это?

Метод find выглядит как опция, так как мой список содержит объекты.

4b9b3361

Ответ 1

Я не знаю, что вы имеете в виду точно, но технически говоря, это невозможно без цикла.

Может быть, вы имеете в виду использование LINQ, например, например:

list.Where(x=>x.Title == title)

Стоит отметить, что итерация не пропущена, а просто завернута в запрос LINQ.

Надеюсь, что это поможет.

EDIT

Другими словами, если вы действительно заинтересованы в производительности, продолжайте кодирование так, как вы уже делаете. В противном случае выберите LINQ для более сжатого и понятного синтаксиса.

Ответ 2

Здесь идет Linq:

var listItem = list.Single(i => i.Title == title);

Он выдает исключение, если нет элемента, соответствующего предикату. Альтернативно, там SingleOrDefault.

Если вам нужна коллекция элементов, соответствующих названию, есть:

var listItems = list.Where(i => i.Title ==  title);

Ответ 3

Мне пришлось использовать его для добавления условия, если вам не нужен индекс

using System.Linq;

использование

if(list.Any(x => x.Title == title){
// do something here
}

это скажет вам, соответствует ли какая-либо переменная вашему заданному условию.

Ответ 4

Рассмотрим создание индекса. Словарь может сделать трюк. Если вам нужна семантика списка, подкласс и сохранить индекс как частный член...

Ответ 5

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

var myObjects = new Hashtable();
myObjects.Add(yourObject.Title, yourObject);
...
var myRetrievedObject = myObjects["TargetTitle"];

Ответ 6

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

Ответ 7

ObservableCollection - это список, поэтому, если вы не знаете позицию элемента, вы должны смотреть на каждый элемент, пока не найдете ожидаемый.

Возможная оптимизация Если ваши элементы отсортированы, используйте бинарный поиск для улучшения характеристик, иначе используйте словарь как индекс.

Ответ 8

Хорошо, если у вас есть N объектов, и вам нужно получить название всех из них, вы должны использовать цикл. Если вам нужен только заголовок, и вы действительно хотите его улучшить, возможно, вы можете сделать разделенный массив, содержащий только заголовок, это улучшит производительность. Вам нужно определить объем доступной памяти и количество объектов, которые вы можете обрабатывать, прежде чем говорить об этом, может повредить производительность, и в любом случае решение будет изменять дизайн программы, а не алгоритм.