Получить IndexOf Вторая запись int в отсортированном списке в C # - PullRequest
0 голосов
/ 21 сентября 2018

У меня проблема при попытке получить первую и вторую запись (не второй самый высокий / самый низкий целое число ) из отсортированного списка.Допустим, список состоит из трех записей, которые по порядку выглядят так: 0, 0, 1.

Я пытался так:

int FirstNumberIndex = MyList.IndexOf(MyList.OrderBy(item => item).Take(1).ToArray()[0]); //returns first record index, true
int SecondNumberIndex = MyList.IndexOf(MyList.OrderBy(item => item).Take(2).ToArray()[1]); //doesn't seem to work

Как я уже объяснил, я пытаюсь получитьиндексы первых двух нулей (они не обязательно должны быть в порядке возрастания перед сортировкой), а не нуля и 1. Итак, если был список {0, 2, 4, 0}, мне нужно получить индексы 0 и 3. Ноэто может относиться к любому числу, которое является наименьшим и повторяется в списке.Однако он также должен работать, когда наименьшее значение не повторяется.

Ответы [ 4 ]

0 голосов
/ 21 сентября 2018

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

0 голосов
/ 21 сентября 2018

Вы можете попробовать пользователя FindIndex.

var MyList = new List<int>() {3, 5, 1, 2, 4};
int firsIndex = MyList.FindIndex(a => a == MyList.OrderBy(item => item).Take(1).ToArray()[0]);
int secondIndex = MyList.FindIndex(a => a == MyList.OrderBy(item => item).Take(2).ToArray()[1]);
0 голосов
/ 21 сентября 2018

Вы можете вычислить смещение первого вхождения, а затем использовать IndexOf в списке после пропуска смещения.

int offset = ints.IndexOf(0) + 1;
int secondIndex = ints.Skip(offset).ToList().IndexOf(0) + offset;
0 голосов
/ 21 сентября 2018

Вы, наверное, спрашиваете что-то вроде этого:

var list = new List<int>{0,0,1}; 
var result = list.Select((val,i)=> new {value = val, idx = i}).Where(x=>x.value == 0);
foreach(var r in result) //anonymous type enumeration
    Console.WriteLine(r.idx);
...