我有一个空格分隔的int列表如下所示:
1 -2 3 1 -8 3 -2 5我需要这个列表的一个特定范围的绝对和,即从第4指数到第6指数。结果将是10(从abs(-8-2))。
通过使用下面的代码,我可以获得完美的结果:
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就这样做呢?
发布于 2022-09-07 04:30:09
这是LINQ扩展方法的一个很好的用例。
projection
G 215。
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扩展方法:
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;发布于 2022-09-07 05:19:46
,但是有什么方法可以不使用Linq来完成它呢?
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来获得您期望的输出。
如果您显式地需要字符串解析:
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返回的null。StringSplitOptions简化了空格的修整。
发布于 2022-09-07 04:49:19
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);我认为下面的代码是正确的
<代码>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代码)中从数学范围开始。
https://stackoverflow.com/questions/73629990
复制相似问题