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

本文关键字:索引 数据 列表 数组 如果 何减去 | 更新日期: 2023-09-27 18:15:40

首先,我不确定我在这个问题中的标题是否传达了我想问的问题。我只是不知道如何用一句话来描述我的问题,希望标题不会造成任何误导。

如果我有一个列表。列表中包含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              
     }
}

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

  1. Array项目转换为List
  2. 然后从列表中删除范围
  3. 将其转换回Array
  4. 插入List

示例:

        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();

Update: Array。

       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;
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);
}

调整列表和数组的大小是一个开销很大的操作。您是否会考虑使用具有方便接口和优化底层结构的自定义数据结构来满足您的需求?所以每一个刻度只增加一个整数值表示offset:

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];
            }
        }
    }
}