2013-06-23 97 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; 
}