Все сказанный leppie - плюс:
int index = mylist.FindIndex(p => p.id == 1);
if(index<0) {
mylist.Add(car3);
} else {
mylist[index] = car3;
}
Это просто использует существующий FindIndex, чтобы определить местоположение автомобиля с идентификатором 1, затем заменить или добавить его. Никакой LINQ; никакой SQL - просто лямбда и List<T>
.
Чтобы получить значение из SessionVar
или RequestVar
, вызовите метод
, то есть sessionUserType .is
Кстати, вы читали « Управляющее состояние »?
Я считаю, что RequestVar
лучше подходит для вашего случая. Я не уверен, что смогу правильно уловить ваш код без контекста, но его можно было бы переписать как минимум так:
case class LoginType
case object StudentLogin extends LoginType
case object ProviderLogin extends LoginType
object loginType extends RequestVar[Box[LoginType]](Empty)
// RequestVar is a storage with request-level scope
...
"provider" -> SHtml.link("/providerlogin",() => loginType(Full(ProviderLogin)), Text("Provider")),
// `SHtml.link` works in this way. Your closure will be called after a user
// transition, that is when /providerlogin is loading.
...
val studentSessionType = If(() => { loginType.is map {_ == StudentLogin} openOr false },
"not a student session")
// As a result, this test will be true if our RequestVar holds StudentLogin,
// but it will be so for one page only (/studentlogin I guess). If you want
// scope to be session-wide, use SessionVar
Я думаю, что отключение заключается в том, что вы предполагаете, что Атрибут сеанса будет соответствовать вашей SessionVar , а это не так. Lift - это очень безопасный фреймворк, и одна из его особенностей состоит в том, что Lift создает непрозрачные идентификаторы GUID для ссылки на компоненты на на стороне сервера.
Если вы хотите, чтобы getSessionAttribute
возвращал что-то, подумайте, как вы можете вызвать setSessionAttribute
.