如何避免循环内的数据丢失

Posted

技术标签:

【中文标题】如何避免循环内的数据丢失【英文标题】:How to avoid data loss inside of a loop 【发布时间】:2021-08-27 12:29:38 【问题描述】:

我有一个奇怪的问题,我在一个简单的 for 循环中丢失了数据。

基本上我有一个间隔,我必须以较小的间隔切割一个标记(这里是 5.0)。整个结果被保存到一个列表数组中。

我使用开关索引(例如,我们可以通过 find 命令轻松获得的数字 5 的索引)和块数(最后的间隔更小)。

我的算法运行良好,因为我在每个循环之后打印我提取的较小间隔。然而,当传递到下一个循环时,前一个间隔被放入一个空列表。为什么会这样?最后我有一个无用的空列表数组。

我添加了 WriteLine 语句来显示问题。在一个循环完成之前,我得到了我想要的间隔,但是当传递到下一个循环时,变量会以某种方式被清空

    var wholeList = new List<double>  1.2, 2.5, 5.0, 2.2, 3.4, 5.0, 1.2, 2.5, 5.0, 2.2, 3.4, 5.0, 1.2, 2.5, 5.0, 2.2, 3.4, 5.0 ;
    int[] switchIndex =  2, 5, 8, 11, 14, 17;
    int number0 = 6;

    var result0 = DivideInterval(wholeList, number0, switchIndex);

调用函数

    List<double>[] DivideInterval(List<double> myList, int numberOfBlocks, int[] switchingPoint)
    
        List<double>[] finalArray = new List<double>[numberOfBlocks];
        var temporaryList = new List<double>  ;


        int j = 0;

        for (int i = 0; i < switchingPoint.Length; i++)
        

            for (int k = j; k <= switchingPoint[i]; k++)
                temporaryList.Add(myList[k]);

            finalArray[i] = temporaryList;

            Console.WriteLine("---");
            foreach (var item in finalArray[i])
                Console.WriteLine(item);
            Console.WriteLine("---");
            temporaryList.Clear();
            j = switchingPoint[i] + 1;

        

        Console.WriteLine("--final result");
        for (int item = 0; item < finalArray.Length; item++)
        
            Console.WriteLine("length is: " + finalArray[item].Count());
            for (int number = 0; number < finalArray[item].Count(); number++)
                Console.WriteLine(item);
        
        Console.WriteLine("--final result");


        return finalArray;

    

【问题讨论】:

List&lt;double&gt;[] - 我从未在现实生活中的代码中看到过这种情况...... 因为较小的间隔需要是动态的;它们没有固定的大小。它们可以很大也可以很小。该示例只是简单地显示问题。列表列表会是更好的方法吗? 【参考方案1】:

你只有一个列表,就是

var temporaryList = new List<double>  ;

请注意,列表是一种引用类型。

当你将它分配到一个数组中时

finalArray[i] = temporaryList;

然后清除它,

temporaryList.Clear();

“两个”列表都被清除:数组中的一个和temporaryList - 因为它实际上只有一个实例(一个对象)。

代替

temporaryList.Clear();

你需要创建一个新对象:

temporaryList = new List<double>  ;

【讨论】:

非常感谢。我一直想知道循环是否错误。我在错误的地方查看问题【参考方案2】:

试试这个,

finalArray[i] = new List<double>();
finalArray[i].AddRange(temporaryList);

取而代之的是,

finalArray[i] = temporaryList;

【讨论】:

以上是关于如何避免循环内的数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

04-05 | AOF日志:宕机了,Redis如何避免数据丢失?

如何在我的数据库中避免 NULL,同时还表示丢失的数据?

Eclipse启动时,项目文件丢失了,这种问题如何避免?

如何避免activeMQ数据丢失

如何通过多线程使用socket和pyqt避免数据丢失

VB.NET 在 Parallel.for Synclock 内的嵌套循环中运行 sum 丢失信息