C# 如何在不在C中添加变量本身的情况下,将变量(列表列表)的值添加到列表(列表列表列表)中#

C# 如何在不在C中添加变量本身的情况下,将变量(列表列表)的值添加到列表(列表列表列表)中#,c#,list,C#,List,因此,C#有一个很好的特性,可以将实际变量添加到列表中,但这对我现在没有帮助,因为我需要所述变量的值 public List<List<float?>> distMatrix = new List<List<float?>>(); public List<List<float>> routeMatrix = new List<List<float>>(); public List<List<

因此,C#有一个很好的特性,可以将实际变量添加到列表中,但这对我现在没有帮助,因为我需要所述变量的值

public List<List<float?>> distMatrix = new List<List<float?>>();
public List<List<float>> routeMatrix = new List<List<float>>();
public List<List<List<float?>>> distMatrixHistory = new List<List<List<float?>>();
public List<List<List<float>>> routeMatrixHistory = new List<List<List<float>>();
这是我的一段代码,它将这些矩阵添加到矩阵历史列表中。问题是我循环并更改这些矩阵的值,但我不希望matrixhistory列表中元素的值也更改

我知道,理论上,我可以手动操作。我知道我可能可以编写一个小函数,循环并分别添加每个值。但这似乎是c#应该内置函数(或库)来处理的事情,即使我在研究它时没有发现任何东西

旁注:如果有人想要更多的上下文,这是一个小程序 这运行弗洛伊德的算法,所以我循环每一步,改变我的 距离和我的路线矩阵,还有我的小winforms应用程序 理论上,您可以显示所请求的任何步骤


使用
列表(IEnumerable)
构造函数创建副本:

List<List<float>> copy = routeMatrix.Select(list => new List<float>(list)).ToList();
routeMatrixHistory.Add(copy);
用法示例:

distMatrixHistory.Add(distMatrix.Copy());
routeMatrixHistory.Add(routeMatrix.Copy());

因此,本质上,您只需要将
distMatrix
routeMatrix
的副本添加到它们的历史记录中?术语是“深度副本”。由于您使用的是值类型(
float
),因此深入复制简单列表的简单方法是:
var listB=new list(listA)
。但由于列表本身是一种引用类型,因此不能简单地执行
var listb=new List(listListA)
。您可能需要执行类似于
var listb=newlist(lista.Count)的操作;foreach(listA中的var listA){listListB.Add(new List(listA));}
--然后将该
listListB
添加到归档文件中。因此,这似乎是一个相当有用的答案,我需要多次重用它(也称为循环中的),但我不确定如何添加扩展方法。我试图复制它,但Visual Studio无法识别它。我能想到的唯一区别是我根本不使用静态(我在一开始创建了一个新的类实例,因为我不知道如何使用静态)。我尝试按原样添加它,并尝试将其作为公共添加,但Visual studio似乎不认可它。有什么帮助吗?我得到了error@NurLuskiLevi扩展方法需要在静态类中定义,因此您可能需要创建一个新类。我将更新我的答案以澄清。非常感谢,这解决了我的错误,但由于某些原因,我仍然无法像您在示例用法中那样调用Copy方法。一切都需要在一个静态类中吗?你也可以使用一个基于序列化的深度副本,这在本文中得到了很好的回答。@NurLuskiLevi不,扩展方法可以在任何地方使用。静态扩展类是否在同一命名空间中?如果没有,您是否添加了相关的使用声明?您是否为扩展方法指定了正确的访问修饰符,以便在其他代码中使用,例如
public
/
internal
?我没有向示例中添加访问修饰符,因为这是您需要决定的实现细节。
static class Extensions
{
    static List<List<T>> Copy<T>(this List<List<T>> list)
    {
        return list.Select(l => new List<T>(l)).ToList();
    }
}
distMatrixHistory.Add(distMatrix.Copy());
routeMatrixHistory.Add(routeMatrix.Copy());