Краткий ответ: Нет, вы должны перебрать список.
Длинный ответ: вероятность выбора определенного предмета зависит от количества предметов, которые соответствуют вашим критериям. Таким образом, вы должны отсканировать весь список.
То, что я бы предложил сделать, это собрать все соответствующие элементы в список, а затем взять случайный индекс. Я нахожу это более читабельным и менее запутанным, чем сортировка по случайному числу.
public Category CatByName(string nm)
{
string name = nm.ToUpper();
var matching = Categories.Where(x => x.CategoryName.Contains(name)).ToList();
if (matching.Count == 0)
{
return null;
}
Random rnd = new Random();
return matching[rnd.Next(matching.Count)];
}
Вы не хотите caddr, Вы хотите (если (пустой указатель? (cddr ls))... Или просто используйте длину, чтобы найти длину списка и сравнить его со значением, которым Вы интересуетесь.
' (), который завершает список, всегда будет в положении CDR пары, таким образом ища его в автомобильном положении (который cad+r сделает), не будет продуктивным.
Проблема состоит в том, что, если у Вас есть список с двумя или меньшим количеством объектов, Вы не можете взять caddr его. Попробуйте это:
(define (has-third-item lst)
(<= 3 (length lst)))
Могли быть некоторые случаи, где взятие длины списка может быть неэффективным (такие как список, содержащий миллионы объектов); в этом случае мы можем протестировать, чтобы видеть, имеет ли список нуль длины, один, или два вручную:
(define (has-third-item lst)
(not (or (null? lst)
(null? (cdr lst))
(null? (cddr lst)))))
править: Относительно двадругоеответов , при взятии cddr может работать в этом случае, поскольку входной домен состоит из списка с или двумя или тремя элементами, has-third-item все еще перестал бы работать для списков с нулем или один. В интересах общности я предлагаю идти с решением, которое работает на любой домен.
Если Вы знаете, что Ваш список имеет или два или три элемента (поскольку Вы говорите, что он имеет), можно сделать
(define (has-third-item? l)
(not (null? (cddr l))))
Вы проверяете ли вторая ячейка недостатков (cddr l)
имеет a cdr
или нет. Вы не должны проверять, является ли сам l пустым, или l имеет только один элемент, если Вы не хотите большей родовой функции.
Почему бы не использовать (третий ls)
Вернет третий элемент или NIL, если его нет.