Как определить, что значение пересекает 0 в C #? - PullRequest
0 голосов
/ 03 февраля 2019

Существует список переменных типа int

data = List<int>

Он содержит несколько целых чисел выше 0, несколько целых чисел меньше 0 и так далее.Данные выглядят так:

-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

Как определить, что значение пересекает 0 в C #?

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Есть две версии, которые я могу придумать.Оба используют метод 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
    }
}

Первый возвращает индекс первого неотрицательного числа.

Второй умножает последовательные числа, и если их произведение имеет отрицательныйзнак означает, что числа только что изменили знак.

0 голосов
/ 03 февраля 2019

для каждого элемента в списке, если> 0 добавить в положительный список, если <0 добавить в отрицательный список.это просто, если что-то еще .... </p>

0 голосов
/ 04 февраля 2019

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
0 голосов
/ 03 февраля 2019

Вы можете использовать разрыв, как только появится изменение знака:

var itemSign = Sign(data.FirstOrDefault());
var result = new List<int>();
foreach (var item in data)
{
    if (itemSign == Sign(item))
    {
        result.Add(item);
        Console.WriteLine(item);
    }
    else
        break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...