您可以尝试使用 Linq 来查询validationList
:
using System.Linq;
...
int distributeVal = 7;
List<int> validationList = new List<int>() { 2,2,3 };
...
// validationList = if you want to "update" validationList
var result = validationList
.TakeWhile(_ => distributeVal > 0) // Keep on while we have a value to distribute
.Select(item => { // Distribution
int newItem = item > distributeVal // two cases:
? distributeVal // we can distribute partialy
: item; // or take the entire item
distributeVal -= newItem; // newItem has been distributed
return newItem;
})
.ToList();
Console.Write(string.Join(",",result));
结果:
2,1
,
这是一个非Linq答案,它使用简单函数来计算这些值:
private List<int> GetValidationList(int distributeVal,List<int> validationList)
{
List<int> outputList = new List<int>();
int runningCount = 0;
for (int i = 0; i < validationList.Count; i++)
{
int nextValue;
if (runningCount + validationList[i] > distributeVal)
nextValue = distributeVal - runningCount;
else
nextValue = validationList[i];
outputList.Add(nextValue);
runningCount += nextValue;
if (runningCount >= distributeVal)
break;
}
return outputList;
}
本质上,遍历每个值并将其添加到输出中(如果该值低于所需总数)。如果不是,则计算差异并将其添加到输出中。
使用以下值运行:
List<int> result;
result = GetValidationList(7,new List<int> { 5,5,5 });
result = GetValidationList(7,6,new List<int> { 6,5 });
result = GetValidationList(8,new List<int> { 2,3 });
result = GetValidationList(8,new List<int> { 1 });
result = GetValidationList(8,7 });
result = GetValidationList(2,5 });
result = GetValidationList(3,new List<int> { 1,1,45,16 });
result = GetValidationList(0,50,50 });
提供此输出(在List<int>
中):
5,2
5,2
6,1
2,2
1
5,1
2
1,1
1,7
0
,
Linq支持的最短方法:
private List<int> Validations(int value,List<int> validations)
{
List<int> outputList = new List<int>();
int runningCount = 0;
foreach (var nextValue in validations.Select(t => runningCount + t > value ? value - runningCount : t))
{
outputList.Add(nextValue);
runningCount += nextValue;
if (runningCount >= value) break;
}
return outputList;
}
用法:
var result = Validations(7,1 });
本文链接:https://www.f2er.com/3065051.html