Как получить индекс элемента в IEnumerable?

После сужения моего вопроса я собирался Google, и найдите ответ здесь .

В основном по некоторым причинам ListViewItems установлены выровняться налево. Установка их для Протяжения решает эту проблему. Это сделано через стиль как так:


Это, к сожалению, влияет на каждый столбец, но затем можно установить содержание других столбцов к левому, правильному, центр, как объяснено в ссылке.

133
задан Jader Dias 17 August 2009 в 21:43
поделиться

3 ответа

Весь смысл использования IEnumerable в том, чтобы вы могли лениво перебирать содержимое. Таким образом, на самом деле нет концепции индекса. То, что вы делаете, действительно не имеет большого смысла для IEnumerable. Если вам нужно что-то, что поддерживает доступ по индексу, поместите это в настоящий список или коллекцию.

То, что вы делаете, действительно не имеет большого смысла для IEnumerable. Если вам нужно что-то, что поддерживает доступ по индексу, поместите это в настоящий список или коллекцию.

То, что вы делаете, действительно не имеет большого смысла для IEnumerable. Если вам нужно что-то, что поддерживает доступ по индексу, поместите это в настоящий список или коллекцию.

49
ответ дан 24 November 2019 в 00:02
поделиться

Я бы реализовал его так:

public static class EnumerableExtensions
{
    public static int IndexOf<T>(this IEnumerable<T> obj, T value)
    {
        return obj.IndexOf(value, null);
    }

    public static int IndexOf<T>(this IEnumerable<T> obj, T value, IEqualityComparer<T> comparer)
    {
        comparer = comparer ?? EqualityComparer<T>.Default;
        var found = obj
            .Select((a, i) => new { a, i })
            .FirstOrDefault(x => comparer.Equals(x.a, value));
        return found == null ? -1 : found.i;
    }
}
23
ответ дан 24 November 2019 в 00:02
поделиться

Я бы усомнился в мудрости, но, возможно:

source.TakeWhile(x => x != value).Count();

(используя EqualityComparer .Default для эмуляции ! = , если необходимо) - но вам нужно посмотреть, чтобы вернуть -1, если не найдено ... так что, возможно, просто сделайте это долгим путем

public static int IndexOf<T>(this IEnumerable<T> source, T value)
{
    int index = 0;
    var comparer = EqualityComparer<T>.Default; // or pass in as a parameter
    foreach (T item in source)
    {
        if (comparer.Equals(item, value)) return index;
        index++;
    }
    return -1;
}
115
ответ дан 24 November 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: