其中一个方法
List<T>.IndexOf()
和List<T>.FindIndex()
在处理时间方面更有效率?
此实例中T
的类型为String
。
答案 0 :(得分:14)
IndexOf
执行for循环,使用搜索对象的Equals
实现来查找匹配项。 FindIndex
也会执行for循环,但会评估Predicate
以检查匹配。
他们每个都归结为一个for循环。性能差异(如果有的话)可以忽略不计。以下是一些MSDN摘录:
<强> List<T>.IndexOf Method (T)
强>:
此方法执行线性搜索;因此,此方法是O( n )操作,其中 n 为
Count
。
<强> List<T>.FindIndex Method (Predicate<T>)
强>:
此方法执行线性搜索;因此,此方法是O( n )操作,其中 n 为
Count
。
也就是说,两种功能的使用方式完全不同。前者假设您有一个列表中的对象,您只需知道列表中存在的索引(如果有)。
后者假设您了解某个对象的某些条件,并且您希望找到列表中的对象与该条件匹配的第一个索引。可能有多个匹配,但该方法返回第一个匹配。
答案 1 :(得分:5)
Cᴏʀʏ 建议性能差异可以忽略不计,如果有的话。因为我的直觉是使用委托总是会变慢,所以我决定对其进行测试。
使用 DotNetBenchMark 和以下代码进行测试:
[MemoryDiagnoser]
public class Bench
{
byte[] buffer;
public Bench()
{
buffer = new byte[1024];
}
[Benchmark]
public void FindIndex()
{
int index = Array.FindIndex(buffer, x => x == byte.MaxValue);
}
[Benchmark]
public void IndexOf()
{
int index = Array.IndexOf(buffer, byte.MaxValue);
}
}
性能差异似乎不可忽略,因为它慢了 10 倍以上。
而且即使在数组第 16 个元素匹配的情况下,IndexOf 仍然比 FindIndex 快两倍多