在我的 MyList
List<Person>
中可能有一个 Person
,它的 Name
属性设置为 "ComTruise"。我需要找到第一次出现 "ComTruise" 的索引位置,但不需要整个 Person
元素。
我现在正在做的是:
string myName = ComTruise;
int thatIndex = MyList.SkipWhile(p => p.Name != myName).Count();
如果列表非常大,有没有更优的方式来获取索引?由于它是一个ObservableCollection
,你可以尝试这样做
int index = MyList.IndexOf(MyList.Where(p => p.Name == "ComTruise").FirstOrDefault());
如果你的集合中不存在"ComTruise",它将返回-1
。
正如评论中提到的,这将执行两次搜索。你可以用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;
}
}
也许编写一个简单的扩展方法来实现这个功能是有意义的:
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;
}
var p = MyList.Where(p => p.Name == myName).FirstOrDefault();
int thatIndex = -1;
if (p != null)
{
thatIndex = MyList.IndexOf(p);
}
if (p != -1) ...
IndexOf
只会返回它遇到的第一个实例的索引。 - keyboardPList<T>
,你 可以 使用myList.Select((person, index) => new { Person = person, Index = index }).FirstOrDefault(entry => entry.Person.Name == myName);
但说实话,我不确定这是否比你的方式更好(虽然它会给你一个null
结果而不是Count
如果该项不存在于列表中。如果 "不存在" 的神奇值为thatIndex
等于MyList.Count
,则这可能比thatIndex
更直观)。 - Chris Sinclair