我有5个数字即:1 1 1 2 3; 除了最小数量之外,我必须将它们相加,但我只能删除它一次(如果最小值出现不止一次,我必须保留其余部分).我怎么能用Linq做到这一点?我想:
var min = nums.Min();
var minSum = nums.Where(x => x != min).Sum();
Run Code Online (Sandbox Code Playgroud)
但是它从列表中删除了所有1.如果出现超过1次,我需要一种方法从哪里出去.
所有这一切都与Linq有关.
fub*_*ubo 13
这是一个单线程,如果你的数组是空的,它甚至可以工作
int[] nums = { 1, 1, 1, 2, 3 };
int minSum = nums.OrderBy(x =>x).Skip(1).Sum();
Run Code Online (Sandbox Code Playgroud)
Mag*_*nus 11
一个简单的解决方案如下,但会迭代集合两次.
var nums = new int[]{ 1, 1, 1, 2, 3 };
var minSum = nums.Sum() - nums.Min();
Run Code Online (Sandbox Code Playgroud)
对于只使用Linq迭代集合一次的解决方案,您可以编写:
var nums = new int[] { 1, 1, 1, 2, 3 };
var minSum =
nums.Aggregate(
new {
Min = int.MaxValue,
Sum = 0
},
(accumulator, i) => new {
Min = Math.Min(i, accumulator.Min),
Sum = accumulator.Sum + i
}, (accumulator) => accumulator.Sum - accumulator.Min);
Run Code Online (Sandbox Code Playgroud)
虽然马格努斯看起来已经很好了,但它仍然需要两次迭代列表.一旦找到minium,一次找到总和.
所以我只是展示了更详细但实现更快的实现:
var nums = new int[]{ 1, 1, 1, 2, 3 };
int sum = 0;
int min = int.MaxValue;
foreach (int i in nums)
{
sum += i;
if (i < min) min = i;
}
if (nums.Length > 0) sum -= min;
Run Code Online (Sandbox Code Playgroud)
我不确定for循环是否可能更快foreach,但我认为差异不应该真正可测量.
对于pwas评论我for再次添加版本:
for(int i=0; i<nums.Length; i++)
{
int j = nums[i];
sum += j;
if (j < min) min = j;
}
if (nums.Length > 0) sum -= min;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
449 次 |
| 最近记录: |