Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Something in the likes of IList.IndexOf() but on IEnumerable<T>?

Is there any method / extension method on IEnumerable that allows me to find the index of of an object instance in it? Like IndexOf() in IList?

indexPosition = myEnumerable.IndexOf() ?

Thanks

like image 363
devoured elysium Avatar asked Apr 27 '10 01:04

devoured elysium


2 Answers

An IEnumerable is not an ordered set.
Although most IEnumerables are ordered, some (such as Dictionary or HashSet) are not.

Therefore, LINQ does not have an IndexOf method.

However, you can write one yourself:

///<summary>Finds the index of the first item matching an expression in an enumerable.</summary>
///<param name="items">The enumerable to search.</param>
///<param name="predicate">The expression to test the items against.</param>
///<returns>The index of the first matching item, or -1 if no items match.</returns>
public static int FindIndex<T>(this IEnumerable<T> items, Func<T, bool> predicate) {
    if (items == null) throw new ArgumentNullException("items");
    if (predicate == null) throw new ArgumentNullException("predicate");

    int retVal = 0;
    foreach (var item in items) {
        if (predicate(item)) return retVal;
        retVal++;
    }
    return -1;
}
///<summary>Finds the index of the first occurence of an item in an enumerable.</summary>
///<param name="items">The enumerable to search.</param>
///<param name="item">The item to find.</param>
///<returns>The index of the first matching item, or -1 if the item was not found.</returns>
public static int IndexOf<T>(this IEnumerable<T> items, T item) { return items.FindIndex(i => EqualityComparer<T>.Default.Equals(item, i)); }
like image 141
SLaks Avatar answered Nov 10 '22 00:11

SLaks


Extension Methods for Enumerable Part II - Index injection and index extraction http://chaowchaow.blogspot.com/2008/05/extension-methods-for-enumerable-part.html

like image 34
Robert Harvey Avatar answered Nov 10 '22 01:11

Robert Harvey