有int变量列表
data = List<int>
它包含0之上的几个int,0之下的int等等。数据如下:
-2962
-5787
-1671
-5667
-498
-4463
1399
3608
2173
我需要找到第一项,当此函数从+到-(或从-到+)越过0时,仅获得高于0的第一项或低于0的第一项(取决于第一项的符号) +或-)。
所以我的代码是:
var itemSign = 0;
foreach (var item in data)
{
if (itemSign == Sign(item))
{
result.Add(item);
Console.WriteLine(item);
}
itemSign = Sign(item);
}
但是输出是:
-2962
-5787
-1671
-5667
-498
-4463
1399
3608
2173
似乎根本不起作用,因为在这种情况下我需要获取这些整数:
-2962
-5787
-1671
-5667
-498
-4463
如何定义C#中的值越过0?
答案 0 :(得分:3)
您可以在出现符号更改后立即使用break:
import React, {useState} from 'react';
import {Redirect} from "react-router-dom";
const RedirectHoc = (WrappedComponent) => () => {
const [routName, setRoutName] = useState("");
const redirect = (to) => {
setRoutName(to);
};
if (routName) {
return <Redirect to={"/" + routName}/>
}
return (
<>
<WrappedComponent redirect={redirect}/>
</>
);
};
export default RedirectHoc;
答案 1 :(得分:1)
我可以想到两个版本。两者都使用List<int>.FindIndex()
方法。
class Program
{
static void Main(string[] args)
{
var list = new List<int>() {
-2962 ,
-5787 ,
-1671 ,
-5667 ,
-498 ,
-4463 ,
1399 ,
3608 ,
2173 ,
};
int index = list.FindIndex((x) => x>0)-1;
// index = 5
index=list.Zip(list.Skip(1), (x, y) => Math.Sign(x*y)).ToList().FindIndex((s) => s==-1);
// index = 5
}
}
第一个返回第一个非负数的索引。
第二个数字将连续的数字相乘,如果它们的乘积带有负号,则表示数字刚刚变为正号。
答案 2 :(得分:0)
Usint System.Linq
(只是为了好玩)
var input = new List<int> { -2962, -5787, -1671, -5667, -498, -4463, 1399, 3608, 2173 };
var cross = input
.Zip(input.Skip(1), (a, b) => new []{a,b})
.TakeWhile(t => (t.First() ^ t.Last()) >> 31 == 0)
.SelectMany(_ => _)
.Distinct();
Console.WriteLine(string.Join(",", cross)); //-2962,-5787,-1671,-5667,-498,-4463
如果您只想要行中的最后一个元素或第一个元素,那么Aggregate
可以工作:
var cross = input.Aggregate((a,b) => (a ^ b) >> 31 == 0 ? a : b); //1399
var cross = input.Aggregate((a,b) => (a ^ b) >> 31 == 0 ? b : a); //-4463
答案 3 :(得分:-3)
如果> 0添加到肯定列表,如果<0添加到否定列表。如果没有其他东西,这很简单。