如果有重复,Linq只删除一个项目

CRK*_*CRK 8 c# linq sum

我有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)


Ren*_*ogt 5

虽然马格努斯看起来已经很好了,但它仍然需要两次迭代列表.一旦找到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)