如何获取列表中某个范围内的数字?

时间:2014-02-02 02:40:09

标签: c# list

我有一个整数列表

  

2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299

我想获得一个从31到255的数字列表。如何用C#编码?

1 个答案:

答案 0 :(得分:3)

希望这会奏效。刚刚测试过,它工作正常。

int[] x = {2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299};

List<int> y = new List<int>();

for (int i = 0; i < x.Length; i++)
{
    if ( (x[i] >= 31) && (x[i] <= 255) )
    {
         y.Add(x[i]);
    }
}

所以我使用x的数组。然后我创建一个名为y的列表。我会使用循环来检查值是否符合条件。如果他们这样做,我会将它们添加到y列表中。

foreach (int k in y)
{
    Console.WriteLine(k);
}

使用此循环只是为了确保它有效(可选)。

下次请在发布问题前表明努力。此外,这是一个简单的算法,所以它都是关于循环。即使是初学者程序员也应该知道这一点,只要你知道数组和循环的基础知识。欢迎来到Stack Overflow。

Ansible的回答(效率更高)

但是因为这是一个有序的数组,我们可以通过在我们超过上限后停止搜索来使它更有效。我们知道这些数字都不在我们的范围内。我们可以通过简单地从for循环中断开来做到这一点。

int[] x = {2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299};

List<int> y = new List<int>();

for (int i = 0; i < x.Length; i++)
{
    if ( (x[i] >= 31) && (x[i] <= 255) )
    {
         y.Add(x[i]);
    }
    else if (x[i] > 255)
    {
       // We are past the upper bound, we are okay to stop the for loop now.
       break;
    }
}

但除此之外,我们可以通过对下限实施二进制搜索来提高效率。这样做的目的不是从数组开始处经过所有值开始,而是从中间开始。我们可以通过查看值97(在数组的中间)知道我们的下限必须在数组的前半部分。这已经将我们正在进行的搜索量分成两半。我们可以继续这样做,将数组减半,直到找到我们正在寻找的值。

将它们放在一起它看起来就像这样。

int[] x = {2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299};

List<int> y = new List<int>();

int lowerBoundIndex = binarySearch(array, 0, x.length, 31);

for (int i = lowerBoundIndex; i < x.Length; i++)
{
    if ( (x[i] >= 31) && (x[i] <= 255) )
    {
         y.Add(x[i]);
    }
    else if (x[i] > 255)
    {
       // We are past the upper bound, we are okay to stop the for loop now.
       break;
    }
}

public int binarySearch(int[] array, int lowerbound, int upperbound, int key) {
    int position;

    // To start, find the subscript of the middle position.
    position = (lowerbound + upperbound) / 2;

    while (!IsTargetIndex(array, position, key) && (lowerbound <= upperbound)) {
        if (array[position] > key) // If the number is > key, ..
        { // decrease position by one.
            upperbound = position - 1;
        } else {
            lowerbound = position + 1; // Else, increase position by one.
        }
        position = (lowerbound + upperbound) / 2;
    }


    if (lowerbound <= upperbound) {
        return position;
    } 

    return -1;
}

public boolean IsTargetIndex(int[] array, int position, int key)
{
    int current = array[position];
    int previous;
    if (position == 0)
        previous = -1;
    else
        previous = array[position -1];

    if ((previous < key) && (current >= key))
    {
        return true;
    }

    return false;
}

二进制搜索是从这里获取的,但我不得不修改它,因为我们不是在寻找完全匹配,而是第一个大于或等于下限的项目。这是在IsTargetIndex中完成的。

这可能是也可能不是过度杀伤。如果你的阵列很小,那么这可能不会带来很大的性能提升。但想象一下,如果你的阵列是数百万个节点,那么这可以节省大量时间。

下次请在发布问题前表明努力。此外,这可以通过一个简单的算法完成,所以它都是关于循环。即使是初学者程序员也应该知道这一点,只要你知道数组和循环的基础知识。欢迎来到Stack Overflow。