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

时间:2017-02-16 12:23:25

标签: c# linq sum

我有5个数字,即:1 1 1 2 3; 除了最小数量之外,我必须将它们相加,但我只能删除它一次(如果最小值出现不止一次,我必须保留其余部分)。我怎么能用Linq做到这一点?我想:

var min = nums.Min();
var minSum = nums.Where(x => x != min).Sum();

但是它会删除列表中的所有1。如果出现超过1次,我需要一种方法从哪里出去。

所有这一切都与Linq有关。

4 个答案:

答案 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();