Нахождение индекса очереди, которая содержит член содержащего объекта для данного значения - PullRequest
0 голосов
/ 16 марта 2010

У меня есть очередь, которая содержит коллекцию объектов, один из этих объектов - класс с именем GlobalMarker, в котором есть член с именем GlobalIndex.

Что я хочу сделать, это найти индекс очереди, в которой GlobalIndex содержит заданное значение (оно всегда будет уникальным).

Простое использование метода Contains, показанного ниже, возвращает bool. Как я могу получить индекс очереди этого совпадения?

RealTimeBuffer
  .OfType<GlobalMarker>()
  .Select(o => o.GlobalIndex)
  .Contains(INT_VALUE);

Ответы [ 3 ]

9 голосов
/ 16 марта 2010

Если вам нужен индекс, возможно, вы используете неправильный тип коллекции. Очередь не предназначена для поддержки произвольного доступа (например, массив или List<T>). Если вам нужен произвольный доступ, возможно, вам следует использовать тип, который реализует IList<T>.

1 голос
/ 16 марта 2010

Очереди не предоставляют интерфейс, который возвращает индекс соответствующего элемента, как, к сожалению, и LINQ.

Вы можете рассмотреть возможность использования List<> или Array, если вам нужны такие методы. Тем не менее, можно рассматривать очередь как IEnumerable и прокручивать собственную реализацию - в качестве альтернативы вы можете создать список из очереди и использовать IndexOf:

RealTimeBuffer.OfType<GlobalMarker>()
              .Select(o => o.GlobalIndex).ToList().IndexOf( INT_VALUE );
0 голосов
/ 16 марта 2010

Если все предметы в вашей коллекции имеют тип GlobalMarker, лучше использовать ILis<>

 List<GlobalMarker> RealTimeBuffer = new List<GlobalMarker>();
 GlobalMarker globalMarker = 
        RealTimeBuffer.SingleOrDefault(o => o.GlobalIndex == 1);

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

   ArrayList RealTimeBuffer = new ArrayList();
   RealTimeBuffer.Add(new GlobalMarker(){ GlobalIndex = 3 });
   GlobalMarker globalMarker = 
   RealTimeBuffer.OfType<GlobalMarker>().FirstOrDefault(o => o.GlobalIndex == INT_VALUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...