如果索引是一个数组,如何减去列表索引内的数据长度?

时间:2013-05-27 01:59:36

标签: c# arrays winforms list

嗯,首先,我不确定这个问题中的标题是否表达了我想问的问题。我只是不确定如何用一句话来描述我的问题,希望这个标题不会引起任何误导。

如果我有一个清单。列表中包含100个数据:list<100>

如果我把这个列表放在1秒计时器内,并按照这样做:

myList.RemoveRange(0, 2);

这意味着,每1秒,列表中的数据长度将为-2;

这意味着,每1秒,它将是<98> , <96> , <94> .... <0>

现在我的问题是......我仍然有一个列表,但列表将包含一个数组:list<array[100]>

现在,我想要的是,每1秒钟,列表中数组内的数据长度为-2。但我不知道该怎么做......

我想要的是,每1秒<array[98]> , <array[96]> , <array[96]> ... <array[0]>

因此,如果列表包含<array0[100] , array1[100], array2[100]>

如果我把这个列表放在一个循环中,每1秒,它应该是

array0[98] , array0[96] ... array0[0]
array1[98] , array1[96] ... array1[0]
array2[98] , array2[96] ... array2[0]

更新

List<int[]> myList = new List<int[]>();
object myLock = new object();
Random rand = new Random();

public Form1()
{
    timer1second.Start();
}

private void SomeMethod()
{
    int[] myData = new int [100]

    for (int i = 0; i < 100; i++)
    {
        //generate some random number to store inside myData[]
        myData[i] = rand.Next(1 , 10); 
    }

    lock (myLock)
    {
        myList.Add(myData); //mean List[0] = myData[100]
    }
}

private void timer1second_Tick(object sender, EventArgs e)
{
     lock (myLock)
     {
         //do something here in myList to get the myData[100 - 2]
         //so that every 1 second tick, the data length inside the MyData will be -2              
     }
}

3 个答案:

答案 0 :(得分:1)

  1. Array项转换为List
  2. 然后从列表中删除范围
  3. 将其转换回Array
  4. 将其重新插入List
  5. 以下是一个示例:

            int currentIndex = 0;
    
            var myList = new List<int[]>();
            var intArray = new int[100];
            myList.Add(intArray);
    
            // Convert to List. 
            var newIntArrayList = myList[currentIndex].ToList();
    
            // Remove the ranges 
            // Index would be based on you logic
            newIntArrayList.RemoveRange(0, 2);
    
            //Replace the list with the new arry
            myList[currentIndex] = newIntArrayList.ToArray();
    

    更新: Array.Resize也应提供帮助。

           int currentIndex = 0;
            int arrayLength = 100;
    
            var myList = new List<int[]>();
            var intArray = new int[100];
            myList.Add(intArray);
    
            // Get the array
            var array = myList[currentIndex];
    
            // Resize
            Array.Resize(ref array, arrayLength-2);
    
            //Replace the list with the update array
            myList[currentIndex] = array;
    

答案 1 :(得分:0)

List<int> myList = new List<int>();
for (int i = 1; i < 101; i++)
{
    myList.Add(i);
}

for (int i = 100; i > 0; i--)
{
    System.Threading.Threading.Sleep(1000);
    myList.RemoveAt(i);
    i -= 1;
    myList.RemoveAt(i);
}

答案 2 :(得分:0)

调整列表和数组的大小是一项昂贵的操作。您是否会通过方便的界面和优化的底层结构来考虑满足您需求的自定义数据结构?所以每个滴答只会增加,整数值代表偏移量:

class Data
{
    const int Step = 2;

    List<int[]> data;
    List<int> cursors;

    public Data()
    {
        data = new List<int[]>();
    }

    public void AddArray(int[] array)
    {
        data.Add(array);
        cursors.Add(array.Length);
        // or cursors.Add(0), depending on your needs
    }

    public void Tick()
    {
        for (int i = 0; i < cursors.Count; i++)
        {
            cursors[i] -= Step;
            // or cursors[i] += Step, depending on your needs
        }
    }

    public IEnumerable<int> GetValuesAtIndex(int index)
    {
        for (int i = 0, i < data[index].Length; i++)
        {
            if (i > cursors[index]) // or i < cursors[index]
            {
                yield return data[index][i];
            }
        }
    }
}