1

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

如果我有清单。列表内包含 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              
     }
}
4

3 回答 3

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

更新: 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;
于 2013-05-27T03:45:31.423 回答
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];
            }
        }
    }
}
于 2013-05-28T10:01:55.670 回答
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);
}
于 2013-05-27T02:19:49.847 回答