1

我用 c# 编写了以下程序,它正在编译并给我输出,但我没有得到预期的输出

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace LINQDemo
{
    public class Parent
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public List<Child> Childs { get; set; }
        public Parent()
        {
            Childs = new List<Child>();
        }
    }

    public class Child
    {
        public int ID { get; set; }
        public int ParentID { get; set; }
        public string ChildName { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Parent parent1 = new Parent { ID = 1, Name = "Parent1" };
            Parent parent2 = new Parent { ID = 2, Name = "Parent2" };

            Child child1= new Child { ID = 1, ParentID = 1, ChildName = "C1" };
            Child child2 = new Child { ID = 2, ParentID = 1, ChildName = "C2" };
            Child child3 = new Child { ID = 3, ParentID = 2, ChildName = "C3" };
            List<Parent> parents = new List<Parent>();
            p.Childs.AddRange(new[] { child1, child2 });
            p1.Childs.AddRange(new[] { child3 });
            ps.Add(parent1);
            ps.Add(parent2);
            XElement xml = new XElement("Root",
                    from x in parents
                    from y in x.Childs where x.ID==y.ParentID

                    select new XElement("Child",
                              new XAttribute("ChildID", y.ParentID),
                              new XElement("ChildName", y.ChildName))

                    );

            Console.WriteLine(xml);       

        }
    }
}

我的输出

<Root>
  <Child ChildID="1">
    <ChildName>C1</ChildName>
  </Child>
  <Child ChildID="1">
    <ChildName>C2</ChildName>
  </Child>
  <Child ChildID="2">
    <ChildName>C3</ChildName>
  </Child>
</Root>

预期产出

<Root>
  <Child ChildID="1">
    <ChildName>C1</ChildName>
    <ChildName>C2</ChildName>
  </Child>
  <Child ChildID="2">
    <ChildName>C3</ChildName>
  </Child>
</Root>
4

1 回答 1

1

在 'p' 中插入 'c1' 和 'c2' 的方式会得到准确的输出,但如果你想要预期的结果,你可以用这个替换你的选择:

XElement xml = new XElement("Root", 
      ps.GroupBy(x => x.ID).Select(
        y => new XElement("Child", new XAttribute("ChildID", y.Key),
                          y.Select(z => z.Childs.Select(
                                   k => new XElement("ChildName", k.ChildName))))));

它按其 ID 对“孩子”进行分组,然后选择该组的列表,然后选择他们的 ChildName 作为 XElement(我的代码对我来说就像一个僵尸)。

祝你好运。

于 2013-07-10T19:03:01.347 回答