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

'c1' と 'c2' を 'p' に挿入する方法は、得た正確な出力になりますが、期待どおりの結果が必要な場合は、select を次のように置き換えることができます。

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 に答える