Java编程、C#/.NET编程、Python编程
Web前端、SQL数据库
新手编程1001问(10)
为什么有了IndexOf,还要有FindIndex?
【摘要】对于IndexOf(),相信大家都是很熟悉的,但是,昨天我们提供的List用法中还有一个FindIndex(),看起来功能描述与IndexOf()是一样的啊,可是,这真的有必要吗?既生瑜何生亮啊?
是啊,为什么啊?这两个方法对比,孰优孰劣呢?
下面详细比较一下吧:
// FindIndex的定义
public int FindIndex(Predicate<T> match);
public int FindIndex(int startIndex, Predicate<T> match);
public int FindIndex(int startIndex, int count, Predicate<T> match);
//IndexOf的定义
public int IndexOf(T item, int index, int count);
public int IndexOf(T item, int index);
public int IndexOf(T item);
// 使用方法
int index = keys.FindIndex(x => x == key);
int index = keys.IndexOf(key);
//返回值
第一个匹配的位置索引值,如果不存在,则返回-1。
对呀,既然使用起来,功能和返回值是一样的,有必要定义两套东西吗?
答案挺有意思:这样做是有历史原因的。
因为在C#1.0中,只有IndexOf()。
C# 2.0里觉得这个功能不够灵活,只能匹配整个对象,比如说要查找某个元素的属性等于某个值,就不行了,于是创造了FindIndex()。
原因就这么简单。但是,我们要知道FindIndex()与IndexOf()差别还是很大的,前者能操作的对象和返回的数据更多,使用更灵活。
因此,顺着这个思路,到了C# 3.0时代,觉得FindIndex又不行,只能作用于List,所以又有了LINQ,有了Where...
当然LINQ的产生原因也不是那么单纯的,这是后话了,有机会咱们再详细讨论。
总之,微软的理念一直都是要考虑“兼容”的,商业软件必须保证向前兼容。就如有的网友说的不能因为有了新的,就不支持旧的,不然就不叫升级只能叫更新了。所以,如此这般,看似重复的功能就这样被保留了下来。
其实,IndexOf()用顺手了,一些简单的检查需求,用起来还是很方便的。