我有5个数字,即:1 1 1 2 3; 除了最小数量之外,我必须将它们相加,但我只能删除它一次(如果最小值出现不止一次,我必须保留其余部分)。我怎么能用Linq做到这一点?我想:
var min = nums.Min();
var minSum = nums.Where(x => x != min).Sum();
但是它会删除列表中的所有1。如果出现超过1次,我需要一种方法从哪里出去。
所有这一切都与Linq有关。
答案 0 :(得分:13)
如果你的阵列是空的,这里有一个班轮
int[] nums = { 1, 1, 1, 2, 3 };
int minSum = nums.OrderBy(x =>x).Skip(1).Sum();
答案 1 :(得分:11)
一个简单的解决方案如下,但会迭代集合两次。
var nums = new int[]{ 1, 1, 1, 2, 3 };
var minSum = nums.Sum() - nums.Min();
对于只使用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);
答案 2 :(得分:5)
虽然Magnus看起来已经很好了,但它仍然需要迭代列表两次。一旦找到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;
我不确定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;
答案 3 :(得分:1)
试试这个:
var nums = new int[] { 1, 1, 1, 2, 3 };
var list = nums.ToList();
list.Remove(nums.Min());
var minSum = list.Sum();