23

其中MyList List<Person>可能有一个PersonName属性设置为“ComTruise”。我需要第一次出现“ComTruise”的索引MyList,而不是整个Person元素。

我现在正在做的是:

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

如果列表非常大,是否有更优化的方法来获取索引?

4

4 回答 4

40

你可以使用FindIndex

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

注意:如果在列表中找不到与提供的谓词定义的条件匹配的项目,则FindIndex将返回 -1。

于 2013-06-23T19:14:17.720 回答
25

因为它是一个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;
    } 
}
于 2013-06-23T19:19:39.887 回答
8

编写一个简单的扩展方法来执行此操作可能是有意义的:

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;
}
于 2013-06-23T20:10:33.227 回答
0
var p = MyList.Where(p => p.Name == myName).FirstOrDefault();
int thatIndex = -1;
if (p != null)
{
  thatIndex = MyList.IndexOf(p);
}

if (p != -1) ...
于 2013-06-23T19:13:27.007 回答