Как я могу сказать, имеет ли список третий объект?

Краткий ответ: Нет, вы должны перебрать список.

Длинный ответ: вероятность выбора определенного предмета зависит от количества предметов, которые соответствуют вашим критериям. Таким образом, вы должны отсканировать весь список.

То, что я бы предложил сделать, это собрать все соответствующие элементы в список, а затем взять случайный индекс. Я нахожу это более читабельным и менее запутанным, чем сортировка по случайному числу.

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)];
}
5
задан Kai 19 March 2009 в 22:20
поделиться

5 ответов

Вы не хотите caddr, Вы хотите (если (пустой указатель? (cddr ls))... Или просто используйте длину, чтобы найти длину списка и сравнить его со значением, которым Вы интересуетесь.

' (), который завершает список, всегда будет в положении CDR пары, таким образом ища его в автомобильном положении (который cad+r сделает), не будет продуктивным.

9
ответ дан 18 December 2019 в 13:19
поделиться

Проблема состоит в том, что, если у Вас есть список с двумя или меньшим количеством объектов, Вы не можете взять 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 все еще перестал бы работать для списков с нулем или один. В интересах общности я предлагаю идти с решением, которое работает на любой домен.

4
ответ дан 18 December 2019 в 13:19
поделиться

Если Вы знаете, что Ваш список имеет или два или три элемента (поскольку Вы говорите, что он имеет), можно сделать

(define (has-third-item? l)
  (not (null? (cddr l))))

Вы проверяете ли вторая ячейка недостатков (cddr l) имеет a cdr или нет. Вы не должны проверять, является ли сам l пустым, или l имеет только один элемент, если Вы не хотите большей родовой функции.

1
ответ дан 18 December 2019 в 13:19
поделиться

Почему бы не использовать (третий ls)

Вернет третий элемент или NIL, если его нет.

0
ответ дан 18 December 2019 в 13:19
поделиться

попробуй ...

(and l (cdr l)(cddr l))
0
ответ дан 18 December 2019 в 13:19
поделиться