从一个数组中提取正负数到另外两个数组(正负)的方法

时间:2019-04-06 11:55:34

标签: c#

我正在研究c#,我想知道是否有什么方法可以从一个数组中提取正负数(整数)到另外两个数组,一个包含正数,另一个包含负数

我尝试过类似的事情

.lock()

我必须创建另外两个数组

while(!mutex.tryLock()) {
    QEventLoop loop;
    loop.processEvents();
}

我想我应该创建一个方法,但是我不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

您可以使用LINQ:

var positiveNumbers = numbers.Where(n => n > 0).ToArray();
var negativeNumbers = numbers.Where(n => n < 0).ToArray();

或者另一种方法是计算您有多少个偶数和奇数,创建两个数组,然后填充它们。假设您希望数组的长度正确无误。

// Variables to store counts of positive and negative numbers
int positiveCount = 0;
int negativeCount = 0;

// Because we'll be building new arrays, we need to track our
// position within them, so we create two variables to do that
int positiveIndex = 0;
int negativeIndex = 0;

// loop through once to count the positive and negative numbers
foreach (var number in numbers)
{
    if (number > 0)
    {
        ++positiveCount; // same as positiveCount = positiveCount + 1
    }
    else if (number < 0)
    {
        ++negativeCount;
    }
}

// now we know how many +ve and -ve numbers we have,
// we can create arrays to store them
var positiveNumbers = new int[positiveCount];
var negativeNumbers = new int[negativeCount];

// loop through and populate our new arrays
foreach (var number in numbers)
{
    if (number > 0)
    {
        positiveNumbers[positiveIndex++] = number;
        // number++ will return the value of number before it was incremented,
        // so it will first access positiveNumbers[0] and then positiveNumbers[1], etc.
       // each time we enter this code block.
    }
    else if (number < 0)
    {
        negativeNumbers[negativeIndex++] = number;
    }
}

初始计数的另一种方法是将两个数组定义为与numbers数组相同的长度,然后使用positiveIndexnegativeIndex确定最大填充索引在positiveNumbersnegativeNumbers数组中。不利之处在于,它使用了更多的内存(但是对于这么小的集合而言,内存是便宜的),不利之处在于,您只需要循环一次即可,从而提高性能。

如果您的情况允许,使用通用列表可能会更容易:

var positiveNumbers = new List<int>();
var negativeNumbers = new List<int>();

foreach (var number in numbers)
{
    if (number > 0)
    {
        positiveNumbers.Add(number);
    }
    else if (number < 0)
    {
        negativeNumbers.Add(number);
    }
}

泛型列表基本上是内部数组周围的精美包装器。该列表以相对较小的数组开始。将项目添加到列表中时,会生成更多的数组来存储所有项目。您可以通过查看列表的.Capacity属性来查看内部数组的当前总体大小。不要将CapacityCount混淆。 Count显示列表中实际存在的项目数,而Capacity显示列表在扩展之前可以容纳的项目数。

请注意,在这些答案中,零将被排除,因为您只要求输入正数和负数,而零都不是。如Max Play的评论所强调,如果您认为零为正数,则应将>更改为>=

答案 1 :(得分:0)

假设您将0视为正数,则添加一种方法来检查正数。

 private static bool isNegtive(int number)
 {
     return number < 0;
 }

我会使用数组列表来表示未知数量。它会像这样:

public static void SeparateRandomNumbers()
{
    IList<int> positive_numbers = new List<int>();
    IList<int> negative_numbers = new List<int>();

    Random objeto = new Random();    
    for (int i = 0; i < 50; i++)
    {           
       var number = objeto.Next(-50, 50);    
       if (isNegtive(number))
       {
          negative_numbers.Add(number);
       }
       else
       {
          positive_numbers.Add(number);
       }
    }
 }