c# - 为什么此示例中的每个列表都进行了修改?
问题描述
例如,我想用整数列表初始化我的类:
{1,5,6,7,1,0}
然后修改它们并获取两个字段,一个具有相同的整数列表,第二个具有修改后的整数列表。但结果,我得到了两个带有值的修改列表:{0,4,5,6,0,0}
. 有人可以向我解释为什么这段代码会这样吗?
我的课
public class MyClass
{
public List<int> numbers { get; }
public List<int> diffrentNum { get; set; }
public MyClass(List<int> _numbers)
{
numbers = _numbers;
diffrentNum = GetNumbers();
}
private List<int> GetNumbers()
{
List<int> localNumbers = numbers;
for (int i=0;i<localNumbers.Count-1;i++)
{
if (localNumbers[i] > 0)
{
localNumbers[i]--;
}
}
return localNumbers;
}
}
主要的
static void Main(string[] args)
{
List<int> someDate = new List<int>();
someDate.Add(1);
someDate.Add(5);
someDate.Add(6);
someDate.Add(7);
someDate.Add(1);
someDate.Add(0);
MyClass myclass= new MyClass(someDate);
Console.WriteLine(String.Join("", new List<int>(someDate).ConvertAll(i => i.ToString()).ToArray()));
Console.WriteLine(String.Join("", new List<int>(myclass.numbers).ConvertAll(i => i.ToString()).ToArray()));
Console.WriteLine(String.Join("", new List<int>(myclass.diffrentNum).ConvertAll(i => i.ToString()).ToArray()));
Console.ReadKey();
}
解决方案
通过调用List<int> localNumbers = numbers;
,您将两个变量分配为指向同一个对象,因此通过其中一个所做的任何更改都可以通过另一个看到。创建列表副本的一种方法是使用 Linq 的ToList
:
List<int> localNumbers = numbers.ToList();
推荐阅读
- python - 模式计算器 Python
- emacs - 如何在 emacs 27 中为外部命令设置别名
- python - 无法使用有线 LAN 连接在 Ubuntu 16.04 上使用 pip 安装 python 包
- javascript - 未处理的拒绝:TypeError:无法读取未定义的属性“执行”
- python - windows10上的python问题。使用 GIT。但无法访问“runwindows.sh”:没有这样的文件或目录
- javascript - Crop and resize a group of images without losing quality
- actionscript-3 - cs4 中缺少 insertAt 和 removeAt 向量方法,但存在于文档中
- python - 为什么 list().append() 给我重复的值?
- arrays - Node js循环遍历JSON并根据时间戳获取每个团队的最新值
- swift - 带有 CAAnimation 的 Swift UIApplicationEndBackgroundTaskError