我正在尝试复制一个List
我现在明白为什么我尝试的方法不起作用,但我找不到解决方法。
public void MyTestFunction(BasicGeoposition nPosition)
{
List<MapElement> MyLandmarks = new List<MapElement>();
Geopoint nPoint = new Geopoint(nPosition, AltitudeReferenceSystem.Ellipsoid);
var needleIcon = new MapIcon //has base class MapElement
{
Location = nPoint,
NormalizedAnchorPoint = new Windows.Foundation.Point(0.5, 0.5),
ZIndex = 0,
Title = "Point 1"
};
MyLandmarks.Add(needleIcon);
// Copy Mylandmarks by value
// Attempt 1 - copies reference
// copyOfMapElements = new List<MapElement>();
// copyOfMapElements = MyLandmarks;
//
// Attempt 2 - copies reference
copyOfMapElements = new List<MapElement>(MyLandmarks);
}
您可以使用 LINQ 来执行此操作:
copyOfMapElements = MyLandmarks.Select(l => new MapIcon{ Location = l.Location,
NormalizedAnchorPoint = l.NormalizedAnchorPoint,
ZIndex = l.ZIndex,
Title = l.Title }).ToList();
更新:上述解决方案假定所有列表元素的类型仅MapIcon
,但是如果您需要更通用的解决方案来处理所有派生类型MapElement
则可以使用序列化或反射。 检查此答案以进行 JSON 序列化:https://stackoverflow.com/a/55831822/4518630
copyOfMapElements = JsonSerializer.Deserialize<List<MapElement>>(JsonSerializer.Serialize(list));
简单的答案,列表中只有MapIcon
个项目:
copyOfMapElements = MyLandmarks.ConvertAll(lm => new MapIcon {
Location = lm.Location,
NormalizedAnchorPoint = lm.NormalizedAnchorPoint,
ZIndex = lm.ZIndex,
Title = lm.Title
});
但是由于MapIcon
派生自MapElement
类,并且MyLandmarks列表包含MapElement
而不是MapIcon
它有自己的一组属性,因此您不能使用上面的示例(有点奇怪,没有为这些类实现ICloneable
接口),所以我可能会检查元素的类型并相应地创建新实例。