Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# List/Dictionary.Clear()方法的奇怪行为_C# - Fatal编程技术网

C# List/Dictionary.Clear()方法的奇怪行为

C# List/Dictionary.Clear()方法的奇怪行为,c#,C#,我有一个类似的代码块: List<Object> returnObjDataLine = new List<object>(); foreach (var tuple in dataPerTime) { returnObjDataLine.Clear(); returnObjDataLine.Add(tuple.Item1); foreach (var line in PlotLines) { if (tuple.Item

我有一个类似的代码块:

List<Object> returnObjDataLine = new List<object>();

foreach (var tuple in dataPerTime)
{
    returnObjDataLine.Clear();
    returnObjDataLine.Add(tuple.Item1);
    foreach (var line in PlotLines)
    {
        if (tuple.Item2.Equals(line.Key))
        {
            returnObjDataLine.Add(tuple.Item3);
        }
        else
        {
            returnObjDataLine.Add(null);
        }
    }
    returnObjData.Add(returnObjDataLine);
}
加载循环工作正常,但这似乎非常昂贵,因为可能需要10秒甚至100秒的数千次迭代。每次创建一个新对象似乎效率低下


使用
Clear()
我缺少什么?是否需要先调用某种类型的“提交”?

看起来您需要做的是创建一个临时列表和一个长期列表。。。大概是这样的:

List<Object> longTermObjects = new List<object>();

foreach (var tuple in dataPerTime)
{
    List<Object> returnObjDataLine = new List<Object>();
    returnObjDataLine.Add(tuple.Item1);
    foreach (var line in PlotLines)
    {
        if (tuple.Item2.Equals(line.Key))
        {
            returnObjDataLine.Add(tuple.Item3);
        }
        else
        {
            returnObjDataLine.Add(null);
        }
    }
    longTermObjects.Add(returnObjDataLine);
}
List<MyObject> oldList = new List<MyObject>();
//Put some objects into oldList

List<MyObject> newList = oldList.Select(x => new MyObject(x.Param1, x.Param2)).ToList();
结果:

A = 1
B = 1
A = 0
B = 0
为什么在第四行问B=0?因为B引用了a,所以它不包含a的实际值,所以当a改变时,B也改变了

如果我希望B只包含A的值,那么我需要一种方法来创建一个新的“值”,而不是一个引用。对于每种类型的对象,执行此操作的方式各不相同。一种可能不是最好的方法是:

int B = int.Parse(A.ToString());
它将A转换为表示A值的字符串,然后通过解析将A转换为新的int。现在我将值存储在B中,而不仅仅是一个引用

如果我想对对象表执行相同的操作,那么我必须执行以下操作:

List<Object> longTermObjects = new List<object>();

foreach (var tuple in dataPerTime)
{
    List<Object> returnObjDataLine = new List<Object>();
    returnObjDataLine.Add(tuple.Item1);
    foreach (var line in PlotLines)
    {
        if (tuple.Item2.Equals(line.Key))
        {
            returnObjDataLine.Add(tuple.Item3);
        }
        else
        {
            returnObjDataLine.Add(null);
        }
    }
    longTermObjects.Add(returnObjDataLine);
}
List<MyObject> oldList = new List<MyObject>();
//Put some objects into oldList

List<MyObject> newList = oldList.Select(x => new MyObject(x.Param1, x.Param2)).ToList();
List oldList=新列表();
//将一些对象放入旧列表
List newList=oldList.Select(x=>newmyobject(x.Param1,x.Param2)).ToList();

在本例中,我基本上是将oldList中的每个对象创建一个新的MyObject,然后将其放入newList。

不清楚您希望发生什么。在第一种情况下,您的
returnObjData
列表多次包含相同的
returnObjData
引用。这就是引用类型在.NET中的工作方式。你期望发生什么?为什么?如果您希望
returnObjData
包含许多不同的列表,那么第二段代码就是这样做的。不清楚如何在不创建大量单独对象的情况下获得大量不同的对象。如果你能提供一个简单的答案,而不是一个片段,并准确地指出你所期望的,这将更容易得到帮助。上面的答案或多或少地回答了我的问题。我把引用当作一个值。显然,在每次迭代创建新的列表对象之前,运行时会将列表的“值”提交给父对象(最后一个
Add()
)?不,没有“提交”-这只是理解引用类型在.NET中如何工作的问题。他已经有了这个问题。他需要有人向他更清楚地解释引用类型。虽然我没有给出负一,但对于那些偶然发现这一点并且不理解引用类型的人来说,这个例子是错误的。int B=A;将B设置为A.Console.WriteLine($“B={B}”)的值;我会写出1。int默认为值类型,而不是引用类型。