SecondNumberIndex установлен в 0, потому что
MyList.OrderBy(item => item).Take(2).ToArray()[1] == 0
, тогда вы получите
MyList.IndexOf(0)
, который находит, что первое вхождение 0. 0 равно каждому другому 0. Поэтому каждый раз, когда выспросите IndexOf (0), будет найден самый первый 0 в списке.
Вы можете получить то, что хотите, используя такой подход:
int FirstNumberIndex = MyList.IndexOf(0); //returns first record index, true
int SecondNumberIndex = MyList.IndexOf(0, FirstNumberIndex + 1 ); //will start search next to last ocurrence
Из вашего кода, я думаюВы путаете некое «равенство экземпляров» с обычным «равенством».Int - простой тип, IndexOf не будет искать вхождение вашего конкретного экземпляра 0. Имейте в виду, что этот код, даже если мы переместимся в наших мыслях к реальным объектам:
MyList.OrderBy(item => item).Take(2).ToArray()[1]
не обязательно будет возвращать равные объекты в их исходном относительном порядке из списка ввода.
РЕДАКТИРОВАТЬ
Это не может быть принято для общего случая, для получения индексовупорядоченные значения из исходного, неупорядоченного списка.
Если вы ищете индексы любого числа равных значений, тогда установка большего и большего смещения для второго параметра IndexOf - это нормально.Но давайте рассмотрим случай, когда нет дубликатов.Такой подход будет работать только тогда, когда список ввода фактически упорядочен;)
Вы можете предварительно обработать ваш список ввода, чтобы иметь пары (значение = список [i], idx = i), затем отсортировать эти пары по значению, а затемперебрать отсортированные пары и вывести idx-es