Если я правильно понимаю, вы хотите вернуть 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;
}