2013-06-23 137 views
11

MyListList<Person>可能有Person,其Name屬性設置爲「ComTruise」。我需要該列表中Person的索引。不是Person,只是它的索引。獲取列表中物品的索引

什麼我現在做的是:

string myName = ComTruise; 
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count(); 

我怎麼可以做的更好,或者使用的IndexOf方法來執行相同的任務?

+2

這幾乎是的IndexOf做什麼... –

+0

是MYLIST自己的收藏或者是列表? –

+0

對不起,改正了。 IndexOf的語法怎麼樣? – Sturm

回答

12

因爲它是一個ObservableCollection,你可以試試這個

int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault()); 

它將返回-1如果「ComTruise」沒有您的收藏中存在。

正如在評論中提到的那樣,這會執行兩次搜索。您可以使用for循環對其進行優化。

int index = -1; 
for(int i = 0; i < MyList.Count; i++) 
{ 
    //case insensitive search 
    if(String.Equals(MyList[i].Name, "ComTruise", StringComparison.OrdinalIgnoreCase)) 
    { 
     index = i; 
     break; 
    } 
} 
+0

那麼,你先找到它然後再找一遍?這是非常低效的。 – svick

+0

你說得對,如果列表很大,For循環會更好。我已經更新了我的答案。 – keyboardP

+0

你爲什麼改變比較來匹配子串?例如,「X-ComTruise」的名稱將匹配您的「不區分大小寫的搜索」。 – svick

0
var p = MyList.Where(p => p.Name == myName).FirstOrDefault(); 
int thatIndex = -1; 
if (p != null) 
{ 
    thatIndex = MyList.IndexOf(p); 
} 

if (p != -1) ... 
17

你可以使用FindIndex

string myName = "ComTruise"; 
int myIndex = MyList.FindIndex(p => p.Name == myName); 

注:FindIndex返回-1如果項目不匹配由所提供的謂詞所定義的條件可以在列表中找到。

+0

Arg,實際上它是一個ObservableCollection而不是List,有什麼等價的東西嗎?我認爲在這個特殊情況下它是一樣的。 – Sturm

+0

如果我使用.ToList()方法將我的ObservableCollection轉換爲List,它會很好地工作。謝謝! – Sturm

+0

破解,這肯定會讓你感到厭倦,但是你也可以在沒有轉換的情況下做到這一點(其他答案已經顯示瞭如何= D)。 – Chris

6

這可能是有意義的編寫,做一個簡單的擴展方法:

public static int FindIndex<T>(
    this IEnumerable<T> collection, Func<T, bool> predicate) 
{ 
    int i = 0; 
    foreach (var item in collection) 
    { 
     if (predicate(item)) 
      return i; 
     i++; 
    } 
    return -1; 
}