Монада является типом данных, который начинает две операции: >>=
(иначе bind
) и return
(иначе unit
). return
принимает произвольное значение и создает экземпляр монады с ним. >>=
берет экземпляр монады и отображает функцию по нему. (Вы уже видите, что монада является странным видом типа данных, с тех пор на большинстве языков программирования Вы не могли записать функцию, которая принимает произвольное значение и создает тип из него. Монады используют своего рода параметрический полиморфизм .)
В нотации Haskell, интерфейс монады записан
class Monad m where
return :: a -> m a
(>>=) :: forall a b . m a -> (a -> m b) -> m b
, Эти операции, как предполагается, подчиняются определенным "законам", но это не ужасно важно: "законы" просто шифруют способ, которым должны вести себя разумные реализации операций (в основном, это >>=
и return
должно согласиться о том, как значения преобразовываются в экземпляры монады и что >>=
ассоциативно).
Монады не являются примерно состоянием и вводом-выводом: они абстрагируют общий шаблон вычисления, которое включает работу с состоянием, вводом-выводом, исключениями и недетерминизмом. Вероятно, самые простые монады для понимания являются типами опции и списками:
instance Monad [ ] where
[] >>= k = []
(x:xs) >>= k = k x ++ (xs >>= k)
return x = [x]
instance Monad Maybe where
Just x >>= k = k x
Nothing >>= k = Nothing
return x = Just x
то, где []
и :
конструкторы списка, ++
, является оператором конкатенации, и Just
, и Nothing
эти Maybe
конструкторы. Обе из этих монад инкапсулируют общие и полезные шаблоны вычисления на их соответствующих типах данных (обратите внимание, что ни один не имеет никакого отношения к побочным эффектам или вводу-выводу).
действительно необходимо играть вокруг записи некоторого нетривиального кода Haskell для понимания то, о чем монады и почему они полезны.
Это будет работать, если у вас есть только один выбор и одна таблица, построенная как в вашем примере
$(document).ready(function($) {
var rows = $('table tr').each(function() {
var row = $(this);
var columns = row.children('td');
row.data('name-chars', [
columns.eq(0).html()[0].toUpperCase(),
columns.eq(1).html()[0].toUpperCase(),
]);
});
$('select').change(function() {
var char = $(this).val().toUpperCase();
rows.each(function() {
var row = $(this);
var chars_to_match = row.data('name-chars');
if($.inArray(char, chars_to_match) > -1) {
row.show();
}
else {
row.hide();
}
});
});
});
Я придумал это. Очень похоже на то, что придумал Эльзо, но он ограничивает его первыми двумя столбцами таблицы.
$('select').change( function(e) {
var letter = $(this).val();
if (letter === 'ALL') {
$ ('tr').show ();
}
else {
$('tr').each( function(rowIdx,tr) {
$(this).hide().find('td').each( function(idx, td) {
if( idx === 0 || idx === 1) {
var check = $(this).text();
if (check && check.indexOf(letter) == 0) {
$(tr).show();
}
}
});
});
}
});
Он не игнорирует регистр и предполагает, что у вас есть один выбор, а на странице только те, которые вы хотите отфильтровать .
РЕДАКТИРОВАТЬ Добавлен параметр «ВСЕ», чтобы снова отображать строки.
Если идентификатор вашей таблицы - sel , а таблица - tab , это поможет. Измените eq (0) , чтобы изменить столбец для поиска. Пустое значение в поле выбора повторно отобразит все trs.
var selSelection = $("#sel").val();
if(!selSelection) $("#tab tr").show();
else $("#tab tr").show().filter(function(index){
return $("td:eq(0)", this).html().indexOf(selSelection) == -1;
}).hide();
Изменить: Я только что заметил, что enumerable
- это IQueryable
, но selectFunc
и whereFunc
относятся к типу Func
. Это приведет к вызову Enumerable
версий OrderBy
и Where
вместо использования вызовов базы данных. Вероятно, вы захотите вместо этого переключить их на Expression
.
Если вы не хотите сначала заказывать regNums
, вот O (n) Решение в стиле гольфа:
var max = regNums.Max(i => (int?)i) ?? 0;
return Enumerable.Range(1, max + 1)
.Except(regNums)
.Min();
По строке:
При приведении к int?
, Макс
вернет null
, если regNums
пусто, объединено с 0
.
Создайте последовательность из всех возможных регистров,
Попробуйте это. При необходимости замените y на $ (y).
$('tr').hide();
$('select').change( function(){
var letter = $(this).val();
var dataset = $('#tableID').find('td');
$.each(dataset, function(x, y){
if( y.substr(0,1) == letter){
y.parent().show();
}
});
});
Edit
@SolutionYogi. Ты прав. Думаю, эту строку можно переписать так:
var dataset = $('#tableID').find('tr').children('td').slice(0,1);
Впрочем, никогда не пробовал.
РЕДАКТИРОВАТЬ 2
Я это тестировал. Надеюсь, он также достаточно элегантен и у меня больше нет ошибок.
$('tr').hide();
$('select').change( function(){
var letter = $(this).val();
var dataset = $('#tableID').find('tr');
$.each(dataset, function(x, y){
var data = $(y).children().slice(0,2);
$.each(data, function(a, b){
if( $(b).html().substr(0,2) == letter){
$(b).parent().show();
}
});
});
});