将新列添加到现有列表中

问题描述 投票:-1回答:1

我有一个包含字段的类-ID,名称,公司和另外29个字段。我从xml(大约有100行)中获取值。我正在使用xmldeserialiser反序列化。现在,我有一个新字段,必须根据序列化后获得的值进行计算。有什么方法可以将它们添加到现有列表中吗?

尝试使用foreach循环进行迭代并添加到列表中。它没有设置值。

对此有任何建议,将不胜感激。

c# list xml-parsing
1个回答
0
投票

下面的代码段是我用来序列化和反序列化xml字符串的扩展方法。请注意,这些需要放置在静态类中,并在该类中引用才能使用。

    /// <summary>
    /// Serializes the object to xml string.
    /// </summary>
    /// <returns>xml serialization.</returns>
    public static string SerializeToXml<T>(this T instance)
        where T : class, new()
    {
        string result;

        var format = new XmlSerializer(typeof(T));
        using (var strmr = new StringWriter())
        {
            format.Serialize(strmr, instance);
            result = strmr.ToString();
        }

        return result;
    }

    /// <summary>
    /// Deserializes xml serialized objects.
    /// </summary>
    /// <param name="xmlDocument">serialized string.</param>
    /// <param name="result">out parameter.</param>
    /// <returns>Instance object.</returns>
    public static bool TryParseXml<T>(this string xmlDocument, out T result)
        where T : class, new()
    {
        result = null;

        if (string.IsNullOrWhiteSpace(xmlDocument))
        {
            return false;
        }

        try
        {
            using (TextReader str = new StringReader(xmlDocument))
            {
                var format = new XmlSerializer(typeof(T));
                XmlReader xmlReader = XmlReader.Create(str);
                if (format.CanDeserialize(xmlReader))
                {
                    result = format.Deserialize(xmlReader) as T;
                }
            }
        }
        catch (InvalidOperationException)
        {
            return false;
        }

        return !(result is null);
    }

实际上,您将拥有某种类型的类,该类具有要存储到磁盘或数据库等中的属性。可以说我有一个类:

public class MyPoint
{
    public double X { get; set;}
    public double Y { get; set;}
}

如果我想不麻烦地存储MyPoint的列表,则可以使用上面的SerializeToXml方法直接序列化该类。

var myPoints = new List<MyPoint>{new MyPoint{ X= 1, Y = 2}, new MyPoint{X = 3, Y = 4}};

var xmlString = myPoints.SerializeToXml();

一切都很好,很好,我的信息以xml格式保存在某个文件中。但是后来我的老板说:“老兄,对此感到抱歉,但是我们现在需要一个Z值,该值是使用Z = X * X + Y * Y从每个X和Y计算得出的。”

将属性添加到序列化的类中不是问题(删除属性是!序列化程序将尝试为不存在的属性分配值,并引发异常。)。但是在这种情况下,我们不必担心。我转到原始的MyPoint类并添加一个Z。

public class MyPoint
{
    public double X { get; set;}
    public double Y { get; set;}
    public double Z { get; set;}  // <---- Here
}

现在,当我解析xml时,将获得具有新属性的类。使用TryParseXml获得点列表。

// assume I have a string already from the xml document to use.

List<MyPoint> points = null;

if(serializedPoints.TryParse(out points))
{
    foreach(var point in points)
    {
        point.Z = X * X + Y * Y;
    }
}


var serializedPointsWithZ = points.SerializeToXml();

现在serializedPointsWithZ只是可以写入文件等的字符串。

© www.soinside.com 2019 - 2024. All rights reserved.