Answers:
int index = myList.FindIndex(a => a.Prop == oProp);
此方法执行线性搜索;因此,此方法是O(n)运算,其中n是Count。
如果找不到该项目,它将返回-1
对于简单类型,可以使用“ IndexOf”:
List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.
编辑:如果您仅使用a List<>
并且只需要索引,那么List.FindIndex
确实是最好的方法。对于需要任何其他内容(例如,最重要的内容IEnumerable<>
)的人,我将在此处保留此答案。
使用其重载Select
在谓词中使用索引,因此您可以将列表转换为(索引,值)对:
var pair = myList.Select((Value, Index) => new { Value, Index })
.Single(p => p.Value.Prop == oProp);
然后:
Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);
或者,如果您只想要索引并且在多个地方使用它,则可以轻松编写自己的扩展方法,就像一样Where
,但是它不返回原始项目,而是返回与谓词匹配的那些项目的索引。
Single()
操作对该序列进行迭代并找到与谓词匹配的单个项。有关更多详细信息,请阅读我的edulinq博客系列:codeblog.jonskeet.uk/category/edulinq
这是字符串列表的代码:
int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
这是整数列表的代码:
int indexOfNumber = myList.IndexOf(/*insert number from list*/);
这是IEnumerable的可复制/粘贴扩展方法
public static class EnumerableExtensions
{
/// <summary>
/// Searches for an element that matches the conditions defined by the specified predicate,
/// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list">The list.</param>
/// <param name="predicate">The predicate.</param>
/// <returns>
/// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
/// </returns>
public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
{
var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
return idx;
}
}
请享用。
int index
样