Получить номер следующей наивысшей версии из доступной версии - PullRequest
1 голос
/ 05 августа 2020

Предположим, что у меня есть 4 разных версии

После удаления обновите sh до следующей наивысшей доступной версии регистра.

Например, если я удалю версию 1.1 в этом списке, я бы ожидал, что страница refre sh будет 1.2. Если я удалю 1.3, я ожидаю, что страница refre sh будет 1.2. Если я удалю 1.0, я ожидаю, что страница refre sh до 1.1

public decimal GetLatestValidCaseVersion()
{
    return Versions
        .Where(b => !b.IsDeleted)
        .OrderByDescending(c => c.DisplayVersion)
        .FirstOrDefault()
        .DisplayVersion;
}

в DisplayVersion, я получу последнюю версию, основанную на lastmodifiedut c .... но я хочу это на основе приведенного выше примера ..... Спасибо заранее

1 Ответ

0 голосов
/ 05 августа 2020

Если я правильно понимаю, вы хотите вернуть DisplayVersion первого элемента в списке, чье DisplayVersion больше, чем наибольшее DisplayVersion элементов, где IsDeleted == true, если ни один из них не больше, и в этом случае вернуть наибольший из не удаленных элементов, а если ни один из них не удален, вернуть наименьший DisplayVersion.

public decimal GetLatestValidCaseVersion()
{
    // Order the items by DisplayVersion
    var ordered = Versions.OrderBy(v => v.DisplayVersion).ToList();

    // Get all the non-deleted items (in order)
    var nonDeleted = ordered.Where(v => v.IsDeleted == false).ToList();

    // Find the item with the greatest DisplayVersion of all deleted items
    var highestDeletedVersion = ordered
        .Except(nonDeleted)
        .LastOrDefault();

    // If there are no deleted items, return the first DisplayVersion
    if (highestDeletedVersion == null)
        return ordered.First().DisplayVersion;

    // Otherwise, return the first non-deleted item whose DisplayVersion 
    // is greater than the greatest deleted item, and if none exist 
    // then return the last non-deleted item's DisplayVersion
    return (nonDeleted
        .FirstOrDefault(v => v.DisplayVersion > highestDeletedVersion.DisplayVersion)
            ?? nonDeleted.Last())
        .DisplayVersion;
}

Или итеративный способ сделать это (который был бы более эффективным) мог бы выглядеть примерно так :

public decimal GetLatestValidCaseVersion()
{
    var ordered = Versions.OrderBy(v => v.DisplayVersion).ToList();
    Version latestValidCaseVersion = null;

    for (int i = 0; i < ordered.Count; i++)
    {
        var prevVersion = i > 0 ? ordered[i - 1] : null;
        var thisVersion = ordered[i];
        var nextVersion = i < ordered.Count - 1 ? ordered[i + 1] : null;

        if (thisVersion.IsDeleted)
        {
            if (nextVersion != null && !nextVersion.IsDeleted)
            {
                latestValidCaseVersion = nextVersion;
            }
            else if (prevVersion != null && !prevVersion.IsDeleted)
            {
                latestValidCaseVersion = prevVersion;
            }
        }
        else if (latestValidCaseVersion == null)
        {
            latestValidCaseVersion = thisVersion;
        }
    }

    return latestValidCaseVersion.DisplayVersion;
}
...