views:

172

answers:

2

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

+2  A: 

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

Robert Harvey
+4  A: 

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)); }
SLaks
Hmm, but if you say it's not an ordered set, shouldn't I then use a IList when I want something that's supposed to be ordered? Seems to me that using IEnumerable to then have to re-implement the wheel is kinda awkward.
devoured elysium
Yes, you should use an `IList<T>`.
SLaks
If the fact that `IEnumerable` is not always ordered motivated the absence of an `IndexOf` extension method, then why do we have `ElementAt`?
Trillian
@Trillian: I have no idea.
SLaks