如何在C#中定义该值与0交叉?

时间:2019-02-03 19:51:12

标签: c# list

有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?

4 个答案:

答案 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添加到否定列表。如果没有其他东西,这很简单。