Получить индекс случайного соответствия значения

1

С# предоставляет способ получить индекс первой соответствующей записи:

int first = myList.IndexOf(myList.Min())

и способ получить последний индекс:

int last = myList.LastIndexOf(myList.Min())

Самый простой способ получить случайный индекс для соответствующего значения, например:

int anyOldOne = myList.RandomIndexOf(myList.Min())
Теги:
list

3 ответа

3
Лучший ответ

Вы можете получить все индексы и выбрать случайный индекс:

// Do this once only
var rnd = new Random();

// Do this each time you want a random element.
var key = myList.Min();
var indices = mylist
             .Select((n,index) => new { n, index })
             .Where(x => x.n == key)
             .Select(x => x.index)
             .ToList();
int anyOldOne= indices[rnd.Next(indices.Count)];

Конечно, это будет выглядеть лучше в методе.

  • 4
    И обратите внимание, что вы не захотите вызывать new Random каждый раз, когда вы это делаете, на самом деле - см. Csharpindepth.com/Articles/Chapter12/Random.aspx
1

Вы можете попробовать это, я создал метод расширения, который можно использовать напрямую, как вы задали в вопросе:

Метод расширения: -

public static int RandomIndexOf<T>(this IList<T> sequence, T element)
        {
            Random rnd = new Random();
            List<int> matchedIndexs = new List<int>();
            for (int i = 0; i < sequence.Count; i++)
            {
                if (sequence[i].Equals(element))
                    matchedIndexs.Add(i);
            }
            return matchedIndexs[rnd.Next(matchedIndexs.Count)];
        }

Тогда вы можете использовать его просто: -

            //Dummy Data Source
            List<int> myList = new List<int> { 4, 1, 5, 7, 1, 2, 1, 4, 1, 4, 6, 1, 1 };
            int random = myList.RandomIndexOf(myList.Min());
0

Может быть:

int min = myList.Min();
var allIndicesWithThatValue = myList
    .Select((i, index) => new { value = i, index })
    .Where(x => x.value == min);
Random rnd = new Random();
int randomIndex = allIndicesWithThatValue
    .ElementAt(rnd.Next(allIndicesWithThatValue.Count())).index;

Обратите внимание, что вы не должны вызывать это в цикле, так как Random высевается с текущим временем. В этом случае вы должны повторно использовать один и тот же Random экземпляр. В противном случае вы всегда получите тот же индекс.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню