Как получить индекс элемента в списке за один шаг?
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);
Автор: Alex Filipovici Размещён: 01.08.2013 01:47Этот метод выполняет линейный поиск; следовательно, этот метод является операцией O (n), где n является Count.
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
, но вместо того, чтобы возвращать исходные элементы, он возвращал индексы тех элементов, которые соответствовали предикату.
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:425 плюса
- Простое решение для поиска индекса для любого строкового значения в списке.
Вот код для списка строк:
int indexOfValue = myList.FindIndex(a => a.Contains("insert value from list"));
- Простое решение для поиска индекса для любого целочисленного значения в списке.
Вот код для списка целых чисел:
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:160 плюса
Если кто-то интересуется 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
Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- c# Datatable против Dataset
- linq LINQ-запрос к DataTable
- linq Условные запросы Linq
- linq Конфликт данных в LINQ
- linq Есть ли способ переопределить пустой конструктор в классе, сгенерированном LINQtoSQL?
- linq Отладка LINQ to SQL SubmitChanges ()
- linq Могу ли я вернуть поле 'id' после вставки LINQ?
- lookup Что быстрее, поиск по хэшу или бинарный поиск?
- lookup Функция с тем же именем, но другой подписью в производном классе
- lookup лучшие практики с кодом или таблицами поиска
- lookup Как я могу получить преобразование поиска SSIS, чтобы игнорировать алфавитный регистр?
- lookup Добавить новые ключи в словарь?
- lookup Как спорить поиск на питоне: make.up.a.dot.separated.name.and.use.it.until.destroyed = 777