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

c# linq lookup

363456 просмотра

8 ответа

Как я могу найти индекс элемента в списке, не просматривая его?

В настоящее время это выглядит не очень хорошо - поиск по списку одного и того же элемента дважды, просто чтобы получить индекс:

var oProp = something;

int theThingIActuallyAmInterestedIn = myList.IndexOf(myList.Single(i => i.Prop == oProp));
Автор: Daniel Robinson Источник Размещён: 12.11.2019 09:15

Ответы (8)


391 плюса

Решение

Как насчет метода List.FindIndex :

int index = myList.FindIndex(a => a.Prop == oProp);

Этот метод выполняет линейный поиск; следовательно, этот метод является операцией O (n), где n является Count.

Автор: Alex Filipovici Размещён: 01.08.2013 01:47

95 плюса

Для простых типов вы можете использовать «IndexOf»:

List<string> arr = new List<string>();
arr.Add("aaa");
arr.Add("bbb");
arr.Add("ccc");
int i = arr.IndexOf("bbb"); // RETURNS 1.
Автор: Jose Manuel Abarca Rodríguez Размещён: 29.10.2014 10:32

70 плюса

РЕДАКТИРОВАТЬ: Если вы используете толькоList<> и вам нужен только индекс, то List.FindIndexэто действительно лучший подход. Я оставлю этот ответ здесь для тех, кому нужно что-то другое (например, поверх любого IEnumerable<>).

Используйте перегрузку Selectкоторого занимает индекс в предикате, поэтому вы преобразуете свой список в пару (индекс, значение):

var pair = myList.Select((Value, Index) => new { Value, Index })
                 .Single(p => p.Value.Prop == oProp);

Затем:

Console.WriteLine("Index:{0}; Value: {1}", pair.Index, pair.Value);

Или, если вам нужен только индекс, и вы используете его в нескольких местах, вы можете легко написать свой собственный метод расширения, который был похож Where, но вместо того, чтобы возвращать исходные элементы, он возвращал индексы тех элементов, которые соответствовали предикату.

Автор: Jon Skeet Размещён: 01.08.2013 01:42

13 плюса

Если вы не хотите использовать LINQ, то:

int index;
for (int i = 0; i < myList.Count; i++)
{
    if (myList[i].Prop == oProp)
    {
       index = i;
       break;
    }
}

Таким образом, вы повторяете список только один раз.

Автор: gzaxx Размещён: 01.08.2013 01:42

5 плюса

  1. Простое решение для поиска индекса для любого строкового значения в списке.

Вот код для списка строк:

int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
  1. Простое решение для поиска индекса для любого целочисленного значения в списке.

Вот код для списка целых чисел:

    int indexOfNumber = myList.IndexOf(/*insert number from list*/);
Автор: user5245248 Размещён: 17.05.2017 01:48

1 плюс

Вот способ расширения для копирования / вставки для IEnumerable

public static class EnumerableExtensions
{
    /// <summary>
    /// Searches for an element that matches the conditions defined by the specified predicate,
    /// and returns the zero-based index of the first occurrence within the entire <see cref="IEnumerable{T}"/>.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="list">The list.</param>
    /// <param name="predicate">The predicate.</param>
    /// <returns>
    /// The zero-based index of the first occurrence of an element that matches the conditions defined by <paramref name="predicate"/>, if found; otherwise it'll throw.
    /// </returns>
    public static int FindIndex<T>(this IEnumerable<T> list, Func<T, bool> predicate)
    {
        var idx = list.Select((value, index) => new {value, index}).Where(x => predicate(x.value)).Select(x => x.index).First();
        return idx;
    }
}

Наслаждаться.

Автор: Snæbjørn Размещён: 22.11.2017 11:16

0 плюса

Если кто-то интересуется Arrayверсией, это выглядит так:

int i = Array.FindIndex(yourArray, x => x == itemYouWant);
Автор: Ali Bordbar Размещён: 08.10.2019 11:56

-1 плюса

Простое решение для поиска индекса для любого строкового значения в списке. Вот код для списка строк:

int indexOfValue = myList.FindIndex(a => a.Contains("//insert value from list"));

Простое решение для поиска индекса для любого целочисленного значения в списке. Вот код для списка целых чисел:

int indexOfNumber = myList.IndexOf(//insert number from list);
Автор: Bob Размещён: 14.10.2018 03:37
Вопросы из категории :
32x32