如何在Observable Collection中搜索项目并获取其索引

时间:2012-02-17 12:54:26

标签: c# .net struct observablecollection

 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 中搜索ID,并获取其索引:

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

什么是快速修复?

编辑:

我们假设有些项目已添加到PLUList,我想添加另一个新项目。但在添加之前,我想检查列表中是否已存在ID。如果确实如此,那么我想在数量上添加+1。

5 个答案:

答案 0 :(得分:16)

使用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
}

答案 1 :(得分:3)

如果要从列表中检索项目,只需使用LINQ:

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

但这会返回项目本身,而不是索引。你为什么要索引?

此外,如果可能,您应该使用class代替struct。然后,您可以针对item测试null,看看是否在集合中找到了ID。

if (item != null)
{
    // Then the item was found
}
else
{
    // No item found !
}

答案 2 :(得分:2)

这是一个快速修复。

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
...

答案 3 :(得分:2)

尽管这篇文章很旧并且已经回答了,但对其他人还是有帮助的,所以我来回答。

您可以创建类似于List<T>.FindIndex(...)方法的扩展方法:

public static class ObservableCollectionExtensions
{
    public static int FindIndex<T>(this ObservableCollection<T> ts, Predicate<T> match)
    {
        return ts.FindIndex(0, ts.Count, match);
    }

    public static int FindIndex<T>(this ObservableCollection<T> ts, int startIndex, Predicate<T> match)
    {
        return ts.FindIndex(startIndex, ts.Count, match);
    }

    public static int FindIndex<T>(this ObservableCollection<T> ts, int startIndex, int count, Predicate<T> match)
    {
        if (startIndex < 0) startIndex = 0;
        if (count > ts.Count) count = ts.Count;

        for (int i = startIndex; i < count; i++)
        {
            if (match(ts[i])) return i;
        }

        return -1;
    }
}

用法:

int index = PLUList.FindIndex(x => x.ID == 13);
if (index > -1)
{
    // Do something here...
}
else
{
    // Do something else here...
}

答案 4 :(得分:1)

这只是一个普通的收藏品。为什么不能迭代它,检查ID并返回对象的索引。有什么问题?

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 );
}