【发布时间】:2022-01-21 00:42:11
【问题描述】:
我正在尝试使用 LINQ 重新排序列表,但似乎很困惑。我想这很简单,但我似乎无法理解它。
我使用 blazor 进行了以下设置:
@foreach (var question in Questions)
{
<div>
<p @onclick="@(() => MoveQuestionUp(question))">Move up</p>
<p @onclick="@(() => MoveQuestionDown(question))">Move down</p>
</div>
}
非常基本的 HTML 只需单击即可重新排序并在列表中上下移动问题。
public void MoveQuestionUp(Question question)
{
return MoveQuestion(question, "up");
}
public void MoveQuestionDown(Question question)
{
return MoveQuestion(question, "down");
}
public async Task MoveQuestion(Question question, string direction)
{
var currentOrder = question.Order;
var updatedOrder = direction == "up" ? currentOrder++ : currentOrder--;
// I'm unsure what to do at this point
// ...
await QuestionService.UpdateQuestionOrder(Questions);
}
我明白,我在这里没有尝试过任何事情,因为我完全不知道下一步该做什么。我理解这个概念。
编辑:
在对评论进行反馈后,我更新了 MoveQuestion 方法,但我认为它不是最佳的,所以想就它获得意见。
public async Task MoveQuestion(Question question, string direction)
{
var questionIndex = Questions.FindIndex(q => q.Id == question.Id);
if (questionIndex == 0 && direction="up")
{
return;
}
var targetQuestionIndex = direction == "up" ? questionIndex - 1 : questionIndex + 1;
var targetQuestion = Form.Questions[targetIndex];
(targetQuestion.Order, question.Order) = (question.Order, targetQuestion.Order);
await QuestionService.SaveChanges();
Questions = Questions.OrderBy(q => q.Order).ToList();
StateHasChanged();
}
【问题讨论】:
-
您需要将问题顺序与下一个或上一个问题顺序交换取决于单击的按钮。
-
@MohammadrezaMohammadi 我已经根据你所说的更新了这个问题。这是正确的方法还是可以优化?
-
你似乎在正确的轨道上,但是我也会检查你是否将列表的最后一个元素向下移动,这也会导致麻烦
-
另外我会保留这两种方法来完成他们的单独任务......检查元素不是“向上”的第一个元素并与前一个元素交换,检查元素不是“向下”的最后一个元素并交换下一个。也许提取一种方法来执行此交换机制。 ...您引入的这些“向上”和“向下”字符串会产生气味。
-
@FlorianSchmidinger 感谢您的意见,您能提供一个例子吗?我不完全确定你的意思,抱歉!