Метод `IndexOf` предназначен для поиска индекса первого вхождения указанного элемента в коллекции. Рассмотрим, как этот метод работает в различных типах коллекций в C#.
### List\<T\>
Сигнатуры:
```csharp
public int IndexOf(T item);
public int IndexOf(T item, int index);
public int IndexOf(T item, int index, int count);
```
Пример:
```csharp
List<string> words = new List<string> { "apple", "banana", "cherry" };
int index = words.IndexOf("banana"); // Возвращает 1
```
- Производительность: O(n) в худшем случае, так как нужно пройти по всему списку для поиска.
Пример 2:
```csharp
List<string> fruits = new List<string> { "apple", "banana", "cherry", "apple", "date", "banana" };
// Начинаем поиск с индекса 1 и проверяем следующие 4 элемента.
int index = fruits.IndexOf("banana", 1, 4);
// Выводит 1, потому что "banana" находится на индексе 1 в заданном диапазоне.
Console.WriteLine(index);
```
В этом примере поиск начинается с элемента, расположенного на индексе 1, и продолжается вплоть до 4 следующих элементов (то есть до индекса 4 включительно). Первое вхождение "banana" найдено на индексе 1 в заданном диапазоне.
### Array
Сигнатуры:
```csharp
public static int IndexOf(Array array, Object value);
public static int IndexOf(Array array, Object value, int startIndex);
public static int IndexOf(Array array, Object value, int startIndex, int count);
```
Пример:
```csharp
string[] words = { "apple", "banana", "cherry" };
int index = Array.IndexOf(words, "banana"); // Возвращает 1
```
- Производительность: Также O(n) в худшем случае.
### HashSet\<T\>
`HashSet<T>` не поддерживает метод `IndexOf`, так как он представляет неупорядоченную коллекцию. Однако, у `HashSet<T>` есть метод `Contains`.
- Производительность: O(1) в большинстве случаев.
### Dictionary<TKey, TValue>
Словари не поддерживают `IndexOf`. Но можно использовать `ContainsKey` или `ContainsValue`.
- Производительность: O(1) для `ContainsKey`, O(n) для `ContainsValue`.