首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何求出c#中列表中特定范围内所有负值的绝对和

如何求出c#中列表中特定范围内所有负值的绝对和
EN

Stack Overflow用户
提问于 2022-09-07 04:00:20
回答 4查看 62关注 0票数 -3

我有一个空格分隔的int列表如下所示:

代码语言:javascript
复制
1 -2 3 1 -8 3 -2 5

我需要这个列表的一个特定范围的绝对和,即从第4指数到第6指数。结果将是10(从abs(-8-2))。

通过使用下面的代码,我可以获得完美的结果:

代码语言:javascript
复制
List<int> _subList = new List<int>();
string _input = Console.ReadLine();
List<int> _list = _input.Split(' ').Select(n => Convert.ToInt32(n)).ToList<int>();
var k =Math.Abs(_list.GetRange(3, 3).Where(x=>x<0).Sum());
Console.WriteLine(k);

但是,有没有办法不使用Linq就这样做呢?

EN

回答 4

Stack Overflow用户

发布于 2022-09-07 04:30:09

这是LINQ扩展方法的一个很好的用例。

projection

  • filter

  • 拆分字符串以获得组成整数字符串

  • 跳过以启动偏移量

  • 采取所需的元素计数(endOffset - startOffset +1)

  • 将字符串值转换为整数,用于负G 215

代码语言:javascript
复制
string input = "...";
var startOffset = 4;
var endOffset = 6;

var absSum = input.Split(' ')
    .Skip(startOffset)
    .Take(endOffset - startOffset + 1)
    .Select(s => Convert.ToInt32(s))
    .Where(i => 0 > i)
    .Select(i => -i)
    .Sum();

没有LINQ扩展方法:

代码语言:javascript
复制
    var targetElements = input.Split(' ')
        //.Skip(startOffset).Task(endOffset - startOffset + 1)
        .AsSpan(startOffset, endOffset - startOffset + 1);
    
    var absSum = 0;
    
    foreach(var element in targetElements)
    {
        //.Select(s => Convert.ToInt32(s))
        var i = Convert.ToInt32(element);
        
        //.Where(i => 0 > i)
        if( 0 > i )
        {
            //.Sum()
            absSum += i;
        }
    }
    
    // we know sum is negative so negate for absolute value
    absSum = -absSum;
票数 2
EN

Stack Overflow用户

发布于 2022-09-07 05:19:46

,但是有什么方法可以不使用Linq来完成它呢?

代码语言:javascript
复制
List<int> data = new List<int>() { 1, -2, 3, 1, -8, 3, -2, 5 };

long sum = 0;

var minIndex = 4;
var maxIndex = 6;

for (int i = minIndex; i <= maxIndex && i < data.Count; i++)
{
    if (data[i] < 0)
    {
        sum -= data[i];
    }
}

上面是使用带适当索引的for循环来获取值,并使用-而不是+Abs来获得您期望的输出。

如果您显式地需要字符串解析:

代码语言:javascript
复制
string input = Console.ReadLine();

var data = input?.Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) ?? Array.Empty<string>();

long sum = 0;

var minIndex = 4;
var maxIndex = 6;

for (int i = minIndex; i <= maxIndex && i < data.Length; i++)
{
    if (int.TryParse(data[i], out var val) && val < 0)
    {
        sum -= val;
    }
}

注意,您需要使用?.Split来处理Console.ReadLine返回的nullStringSplitOptions简化了空格的修整。

票数 2
EN

Stack Overflow用户

发布于 2022-09-07 04:49:19

代码语言:javascript
复制
List<int> _subList = new List<int>();//1
            string _input = Console.ReadLine();//2
            List<int> _list = _input.Split(' ')//3
            .Select(n => Convert.ToInt32(n))//4
            .ToList<int>();//5
            var k =Math.Abs(_list.GetRange(3, 3)//6 
            .Where(x=>x<0).Sum());//7
            Console.WriteLine(k);

我认为下面的代码是正确的

  • In //1中的//2读取空间中的空列表
  • 作为//3中的字符串
  • 在//4中获得从字符串到int列表的
  • ,并转换为从字符串到int

<代码>H 110在//5类型中的所有作为列表,得到整数<H 211<代码>H 112在//6中,GetRange(3,3)从数学范围(3,3+3) (3,3+3] 4,5,6H 213<>H 114在//7求和(获得H 215F 216代码)中从数学范围开始。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73629990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档