首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我是否将两个不同对象列表的XMLArray项按交替顺序排序?

我是否将两个不同对象列表的XMLArray项按交替顺序排序?
EN

Stack Overflow用户
提问于 2021-09-02 07:56:24
回答 3查看 56关注 0票数 0

我有一个类类型,它有两个不同对象类型的列表。当我试图序列化类类型时,我将按顺序获得列表,但我希望得到以交替顺序排列的项目列表。

代码语言:javascript
运行
复制
public class Type
{
    private List<Slow> slowField;

    private List<Fast> FastField;
    
    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("SLOW", Order=1)]
    public List<Slow> SLOW
    {
        get
        {
            return this.slowField;
        }
        set
        {
            this.slowField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("FAST", Order=2)]
    public List<Fast> FAST
    {
        get
        {
            return this.FastField;
        }
        set
        {
            this.FastField = value;
        }
    }
}

当前产出:

代码语言:javascript
运行
复制
<Type>
<SLOW>S1</SLOW>
<SLOW>S2</SLOW>
<SLOW>S3</SLOW>
<FAST>F1</FAST>
<FAST>F2</FAST>
<FAST>F3</FAST>
</Type>

我需要这个输出:

代码语言:javascript
运行
复制
<Type>
<SLOW>S1</SLOW>
<FAST>F1</FAST>
<SLOW>S2</SLOW>
<FAST>F2</FAST>
<SLOW>S3</SLOW>
<FAST>F3</FAST>
</Type>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-02 11:30:18

一种方法是引入第三个集合,将两个现有集合按所需顺序合并。例如,

假设快速和慢的结构如下所示

代码语言:javascript
运行
复制
public class Fast
{
    public int Value{get;set;}
}

public class Slow
{
    public int Value{get;set;}
}

您现在可以为这两种类型引入一个基类(或者使用System.Object作为公共基)。例如,

代码语言:javascript
运行
复制
public class Base{}

public class Fast:Base
{
    public int Value{get;set;}
}

public class Slow:Base
{
    public int Value{get;set;}
}

现在,您可以在Type类中添加第三个集合,如下所示

代码语言:javascript
运行
复制
[XmlElement("SLOW", Type = typeof(Slow))]
[XmlElement("FAST", Type = typeof(Fast))]
public List<Base> Complete => GetMergedList();

private List<Base> GetMergedList()
{
  int minLen = Math.Min(SLOW.Count, FAST.Count);

  var list = SLOW.Take(minLen)
            .Zip(FAST.Take(minLen), (a, b) => new Base[] { a, b })
            .SelectMany(array => array)
            .Concat(SLOW.Skip(minLen))
            .Concat(FAST.Skip(minLen));
  return list.ToList();
}

请注意,代码假定“快速”和“慢”集合已经单独排序,但如果没有,则需要添加逻辑排序。

您还需要使用XmlIgnoreAttribute标记现有属性,以便在序列化期间跳过它们。

代码语言:javascript
运行
复制
[XmlIgnore]
public List<Slow> SLOW
{
....
}

[XmlIgnore]
public List<Fast> SLOW
{
....
}

现在您可以序列化Type实例以获得所需的结果。

演示代码

票数 1
EN

Stack Overflow用户

发布于 2021-09-02 08:27:14

只需交替输出,如果迭代是奇数,则打印第一个列表,如果甚至打印第二个列表。做些像这样的事:

代码语言:javascript
运行
复制
for( int i = 1; i < ListLength; i++) 
{
if( i%2 == 0)
{
// put here your second list dont forget to put i-1 since we started with 1 in for
print(" The value is even");
}
else 
{
//put here your first list
print("the value is odd");
}
}
票数 0
EN

Stack Overflow用户

发布于 2021-09-02 14:15:31

下面是一个使用IXmlSerialize的复杂解决方案。我不知道课程的细节。所以我只是对xml元素的内部文本进行排序

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
using System.Xml.Schema;
using System.Xml.Linq;
using System.IO;
using System.Text.RegularExpressions;

namespace ConsoleApplication2
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Type test = new Type()
            {
                FAST = new List<Fast>() { new Fast() { value = "F1" }, new Fast() { value = "F2" }, new Fast() { value = "F3" } },
                SLOW = new List<Slow>() { new Slow() { value = "S1" }, new Slow() { value = "S2" }, new Slow() { value = "S3" } }
            };

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(FILENAME, settings);
            XmlSerializer serializer = new XmlSerializer(typeof(Type));
            serializer.Serialize(writer, test);

        }
    }
    public class Fast
    {
        public string value { get; set; }
    }
    public class Slow
    {
        public string value { get; set; }
    }

    public class Type : IXmlSerializable
    {
        private List<Slow> slowField;
        private List<Fast> FastField;

        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("SLOW", Order = 1)]
        public List<Slow> SLOW
        {
            get
            {
                return this.slowField;
            }
            set
            {
                this.slowField = value;
            }
        }
        /// <remarks/>
        [System.Xml.Serialization.XmlElementAttribute("FAST", Order = 2)]
        public List<Fast> FAST
        {
            get
            {
                return this.FastField;
            }
            set
            {
                this.FastField = value;
            }
        }
        public void WriteXml(XmlWriter writer)
        {
            string pattern = @"(?'prefix'.*)(?'suffix'\d+)";

            XmlSerializer fastSerializer = new XmlSerializer(typeof(Fast));
            XmlSerializer slowSerializer = new XmlSerializer(typeof(Slow));
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.OmitXmlDeclaration = true;
            settings.ConformanceLevel = ConformanceLevel.Fragment;
            settings.Indent = true;
            MemoryStream ms = new MemoryStream();
            XmlWriter childWriter = XmlWriter.Create(ms,settings);
            childWriter.WriteRaw("<Root>");
            foreach(Slow slow in slowField)
            {
                slowSerializer.Serialize(childWriter,slow);
                //childWriter.WriteRaw("\n");
            }
            foreach (Fast fast in FastField)
            {
                fastSerializer.Serialize(childWriter, fast);
                //childWriter.WriteRaw("\n");
            }
            childWriter.WriteRaw("</Root>");
            childWriter.Flush();
            ms.Position = 0; ;
            string text = Encoding.UTF8.GetString(ms.GetBuffer()); 
            XElement rootElement = XElement.Load(ms);
            var orderChildren = rootElement.Elements()
                .Select(x => new { match = Regex.Match((string)x, pattern), element = x })
                .Select(x => new { prefix = x.match.Groups["prefix"].Value, suffix = x.match.Groups["suffix"].Value, element = x.element })
                .OrderBy(x => x.suffix)
                .ThenBy(x => x.prefix)
                .ToList();

            foreach(var orderChild in orderChildren)
            {
                orderChild.element.WriteTo(writer);
            }
        }
        public void ReadXml(XmlReader reader)
        {
            XmlSerializer fastSerializer = new XmlSerializer(typeof(Fast));
            XmlSerializer slowSerializer = new XmlSerializer(typeof(Slow));
            while (!reader.EOF)
            {
                if (reader.Name == "SLOW")
                {
                    if (slowField == null) slowField = new List<Slow>();
                    slowField.Add((Slow)slowSerializer.Deserialize(reader));
                }
                if (reader.Name == "FAST")
                {
                    if (FastField == null) FastField = new List<Fast>();
                    FastField.Add((Fast)slowSerializer.Deserialize(reader));
                }
            }

        }
        public XmlSchema GetSchema()
        {
            return (null);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69026268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档