Как выполнить поиск элемента и получить его индекс в наблюдаемой коллекции - PullRequest
5 голосов
/ 17 февраля 2012
 public struct PLU { 
         public int ID { get; set; } 
         public string name { get; set; } 
         public double price { get; set; } 
         public int quantity {get;set;}

 }
 public static ObservableCollection<PLU> PLUList = new ObservableCollection<PLU>();

У меня есть ObservableCollection, как указано выше.Теперь я хочу найти идентификатор в PLUList и получить его индекс следующим образом:

int index = PLUList.indexOf();
if (index > -1) {
// Do something here
}
else {
// Do sth else here..
}

Что такое быстрое исправление?

РЕДАКТИРОВАТЬ:

Давайте предположим, что некоторые элементы были добавлены в PLUList, и я хочу добавить еще один новый элемент.Но перед добавлением я хочу проверить, существует ли идентификатор в списке.Если это так, то я хотел бы добавить +1 к количеству.

Ответы [ 4 ]

16 голосов
/ 17 февраля 2012

Используйте LINQ: -)

var q =  PLUList.Where(X => X.ID == 13).FirstOrDefault();
if(q != null) 
{
   // do stuff
}
else 
{
   // do other stuff
}

Используйте это, если хотите сохранить структуру:

var q =  PLUList.IndexOf( PLUList.Where(X => X.ID == 13).FirstOrDefault() );
if(q > -1) 
{
   // do stuff
}
else 
{
   // do other stuff
}
3 голосов
/ 17 февраля 2012

Если вы хотите получить элемент из списка, просто используйте LINQ:

PLU item = PLUList.Where(z => z.ID == 12).FirstOrDefault();

Но это вернет сам элемент, а не его индекс.Зачем вам индекс?

Кроме того, вы должны использовать class вместо struct, если это возможно.Затем вы можете проверить item против null, чтобы увидеть, был ли идентификатор найден в коллекции.

if (item != null)
{
    // Then the item was found
}
else
{
    // No item found !
}
2 голосов
/ 17 февраля 2012

Вот быстрое решение.

int findID = 3;
int foundID=  -1;
for (int i = 0; i< PLUList.Count; i++)
{
  if (PLUList[i].ID == findID)
  {
    foundID = i;
    break;
  }
}

// Your code.
if (foundID > -1) {
// Do something here
...
1 голос
/ 17 февраля 2012

Это просто нормальная коллекция.Почему вы не можете просто перебрать его, проверить идентификатор и вернуть индекс объекта.В чем проблема?

int index = -1;

for(int i=0;i<PLUList.Count;i++) {
 PLU plu = PLUList[i];
 if (plu.ID == yourId) {
   index = i;
   break;
 }
}

if (index > -1) {
// Do something here
}
else {
// Do sth else here..
}

РЕДАКТИРОВАТЬ : LINQ VERSION

private void getIndexForID(PLUListint idToFind,ObservableCollection<PLU> PLUList) {
   PLU target = PLUList.Where( z => z.ID == yourID ).FirstOrDefault();
   return target == null ? -1 : PLUList.IndexOf ( target );
}
...