Tentando inserir/classificar uma lista com base na 'Ordem' valor

0

Pergunta

Estou criando uma documentação do aplicativo no qual eu permitir que pessoas de dentro da minha empresa para acesso a documentação sobre determinado software. Com isso, eu tenho uma página onde qualquer administrador pode gerenciar as categorias e os usuários. Por isso, eu quero que o administrador seja capaz de alterar a ordem de uma categoria em que deve ser exibida na minha NavigationMenu. Agora, a parte onde ele deve corretamente a ordem de categorias com base em uma Ordem dentro da NavigationMenu obras. Mas quando tento editar categorias existentes e seus números de ordem, as ordens não atualizar adequadamente, consulte este exemplo:

Este é antes de editar categorias existentes, estas categorias são recém-adicionado/fez New categories

Isto é, após a edição das categorias, "Reagir", deve ser da Ordem de 2, Onde API seria da Ordem de 0, e a prova seria de Ordem 1 Edited categories

Como você pode ver, o fim não faz mais sentido nenhum. Obviamente, não deve ser permitido que mais de 1 de qualquer ordem.

Agora, o problema é mais provável de vir a partir deste código.

CategoryService.cs

public async Task<List<Category>> InsertCategory(Category category)
        {
            await GetCategories();
            for (int i = 0; i < Categories.Where(c => c.Order >= category.Order).Count(); i++)
            {
                Categories[i].Order++;

                if (Categories[i].Order == category.Order)
                {
                    Categories[i].Order--;
                    break;
                }
            }

            await categoryRepository.InsertAsync(Categories);
            EventHelper.NotifyCategoryListChanged(Categories, EventArgs.Empty);
            return Categories;
        }

A ordem do código vai como esta:

CategoryDialog.navalha

private async void SaveCategory(Category category)
    {
        if(!string.IsNullOrEmpty(category.Name))
        {
            await categoryService.SaveCategory(category);
            Snackbar.Add("Category " + category.Name + " added", Severity.Success);
            MudDialog.Close(DialogResult.Ok(category.Id));       
        }
        else
        {
            Snackbar.Add("Please enter a category name.", Severity.Warning);
        }
    }

O código acima é chamado depois de premir um botão. Este passa ao longo de uma categoria, com um certo número de ordem, este número é transmitido ao longo de um simples menu suspenso.

O SaveCategory função se parece com isso:

CategorySerice.cs

public async Task<Category> SaveCategory(Category category)
        {
            await InsertCategory(category);

            if (categoryRepository.GetByIdAsync(category.Id) == null)
            {
                await categoryRepository.AddAsync(category);
            }
            else
            {
                await categoryRepository.SaveAsync(category);
            }

            EventHelper.NotifyCategoryListChanged(Categories, EventArgs.Empty);

            return category;
        }

Esta função chama a problemática da função antes de realmente salvar/adicionar nada ao banco de dados. Então, ele pode ter lugar para o recém-adicionado ou editado categoria.

Após isso, um Evento é acionado para notificar minha NavigationMenu que houve alterações feitas, e ele deve re-renderização para mostrar isso. Isso não tem problemas.

Mas eu não consigo descobrir como eu seria adequadamente têm as Ordens ser listado quando eu alterá-los. Lembrete rápido, esta função não funciona quando a edição de categorias existentes. Se eu adicionar uma nova categoria, por exemplo, na ordem de 2. Ele faz corretamente mudança de tudo sem problema.

Qualquer ajuda é bem-vindo!

.net c# entity-framework
2021-11-23 11:52:48
1

Melhor resposta

0

Assim, se o usuário tenta fazer um segundo com palavra de ordem 2, que irá reduzir o número de ordem do que era antes?

Seu ciclo de lógica não suporta que, devido a seu ciclo está a aumentar de forma que, quando isso acontece, você já passou o anterior, então você vai ter uma cama de 1, presumivelmente, depois.

Eu acho que você vai chegar onde você quer, se a alteração de seu loop para executar para baixo como o seu empurrando para baixo, embora, obviamente, você vai ter que suportar ordem abaixo de zero em breve e que sempre não é suportado

PARA:

for (int i = Categories.Count() -1; i >-1; i--)
{
    if (Categories[i].Order <= category.Order)
    {
        Categories[i].Order = Categories[i].Order--;
    }
}

Mas, para que tudo faça sentido e que não concorreram para isso eu sugiro empurrando a ordem em vez disso, porque positivos elevados números não têm o mesmo problemas nos cantos, para dizer

Ou, em vez disso:

for (int i = 0; i < Categories.Count(); i++)
{
    if(Categories[i].Order < category.Order) continue;
    Categories[i].Order = Categories[i].Order++;
}

Em última análise, também, a menos que a sua implementação é diferente do que eu imagino, você vai querer adicionar realmente a nova categoria e não todos eles (excluindo thew novo) novamente

--FROM: await categoryRepository.InsertAsync(Categories);
--TO:
await categoryRepository.InsertAsync(category);
2021-11-23 12:22:15

Eu tentei os 2 primeiros soluções, mas esse resultou na Ordem restante em 0 quando a criação de novas categorias. Eu não estou realmente certo do que a última solução não. Mas se isso ajuda a "Categorias" é uma lista dentro de CategoryService.cs Esta é uma fonte única de verdade, quando GetCategories é chamado, ele agarra novas informações a partir do banco de dados.
Rowin

@Remar em direção a última presume que você deseja inserir na nova categoria e não a toda a lista de Categorias que eu não incluem nada sobre o fato de verão mudou, certo? este não era o seu problema e você já mestre. Então, porque eu também presumo que a ordem em seu parâmetro de categoria já está definido corretamente devido a sua comparar a ele e nós não vemos como ela é definida. Você defini-lo já antes de chamar SaveCategory então? como nós não manupulate o parâmetro de categoria, mas simplesmente adicioná-lo como é a única possibilidade é que era sempre 0?
T. Nielsen

O valor da Ordem vem a partir de um menu drop-down, em que U pode selecionar de 0 a atual quantidade de categorias, ou quando criar uma, de 0 a atual quantidade de categorias + 1. Ele está sendo repassados para SaveCategory. O que eu estou tentando fazer agora, é criar uma "Nova" da lista. Onde tudo é deslocada para cima para fazer lugar para a nova categoria. Depois que ele está sendo salvo e realmente adicionado ao banco de dados. Isso funciona bem quando a criação de novas categorias, mas quando editar os documentos existentes não shift até adequadamente para permanecer na ordem correta.
Rowin

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................