如何按<MapElement>值而不是按引用复制列表?



我正在尝试复制一个List但到目前为止只设法复制了引用。任何人都可以提供一种方法来执行此操作而无需再次创建原始 MapIcon 对象。

我现在明白为什么我尝试的方法不起作用,但我找不到解决方法。

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接口),所以我可能会检查元素的类型并相应地创建新实例。

相关内容

  • 没有找到相关文章

最新更新