поиск arraylist по свойству с использованием binarysearch - PullRequest
0 голосов
/ 03 августа 2010

В настоящее время у меня есть arraylist, содержащий классы в C #.Массив заполняется так:

 foreach (XmlElement Path in locaties)
                    {


                        ISoundSource track = engine.AddSoundSourceFromFile(Path.InnerXml);

                        mixarray.Add(track);

                    }

, тогда массив имеет много классов ISoundSource в качестве своих элементов.Теперь то, что выделяет их в массиве, это их свойство name.Позже я хочу получить ISoundSource из массива, выполнив поиск.Я посмотрел на то, как искать arraylists, и говорят, что он использует двоичный поиск, но я не вижу способа поиска объекта с определенным свойством.Как я могу получить элемент из массива с указанным именем?

Ответы [ 4 ]

1 голос
/ 03 августа 2010

Вам, вероятно, следует использовать Словарь <,>, так как его будет намного проще поддерживать. Кроме того, вы должны использовать List <> вместо ArrayList. Если вы должны использовать BinarySearch, вам нужно будет передать ему пользовательскую реализацию IComparer, чтобы он использовал свойство Name. Вот пример со словарем:

var dictionary = new Dictionary<string, ISoundSource>();
foreach (XmlElement Path in locaties)
{
    ISoundSource track = engine.AddSoundSourceFromFile(Path.InnerXml);
    mixarray.Add(track);
    dictionary[track.Name] = track;
}

ISoundSource item = dictionary["MyTrackName"];
0 голосов
/ 03 августа 2010

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

var dictionary = locaties
    .Select(p->engine.AddSoundSourceFromFile(Path.InnerXml))  
    .ToDictionary(t->t.Name);

.Select () преобразует каждый узел в ISoundSource.По завершении возвращается коллекция (IEnumerable of ISoundSource).Затем .ToDictionary () преобразует этот список ISoundSource в словарь строки ISoundSource.

Для этого требуется .NET Framework 3.5 или более поздняя версия.

0 голосов
/ 03 августа 2010

Есть много способов сделать то, что вы просите, и правильный путь зависит от информации, которую вы не предоставили:

  • Имеет ли свойство Name уникально определить элементы?
  • Каждый элемент имеет a Name?
  • Должно ли совпадение быть точным?
  • Важно лизнаете, в каком порядке элементы были первоначально добавлены в список, т. е. в порядке, в котором они появляются в исходном XML?
  • Вы пытаетесь найти элементы по их Name или получить к ним доступ в порядке их Name?
  • Насколько важно, чтобы это было эффективно?

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

ISoundSource track = mixarray
   .Cast<ISoundSource>
   .Where(x => x.Name == name)
   .FirstOrDefault();

, который установит track для первого элемента в списке, имя которого соответствует искомому значению, и на ноль, если совпадений не найдено.(Если вы используете List<ISoundSource> вместо ArrayList, вы можете опустить Cast<ISoundSource> - одну из многих, многих причин для использования List<T> над ArrayList в большинстве случаев.)

Mostвремени я буду использовать Dictionary<TKey, TValue> для такого рода вещей, но это потому, что в большинстве случаев ответы на эти вопросы да, да, да, нет, не заботятся о порядке, довольно важно.

0 голосов
/ 03 августа 2010

Проверьте перегрузку двух параметров BinarySearch, которая принимает IComparer в качестве второго параметра - затем вам нужно создать небольшой класс, наследующий от IComparer, который будет сравнивать имена двух ваших объектов Track и передавать экземпляр этогоСравнитель в BinarySearch.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...