【问题标题】:How to set value in nested LINQ select to parent select result?如何将嵌套 LINQ 选择中的值设置为父选择结果?
【发布时间】:2015-07-31 09:38:20
【问题描述】:

这是我的 LINQ:

            var sdEnumTypes = from et in sdXmlEnums.Elements("Enum")
                          select new SdEnum
                          {
                              Name = et.Attribute("name").Value,
                              EnumGuid = et.Attribute("guid").Value,
                              Enumerators = (from en in et.Elements("Enumerator")
                                             select new SdEnumerator
                                             {
                                                 DisplayName = en.Attribute("displayName").Value,
                                                 Name = en.Attribute("name").Value
                                                 //Enum = I want this to point to parent SdEnum
                                             }).ToList()
                          };

我想将(注释部分)枚举值设置为在升级时选择的 SdEnum。怎么做?

这是正在解析的相应 XML,以便您可视化我想要做什么:

    <Enums>
    <Enum name="Color" guid="{2C68F947-3103-4F3C-9855-60F289B3A039}">
        <Enumerator name="Red" displayName="Red Color"/>
        <Enumerator name="Green" displayName="Green Color" />
        <Enumerator name="Blue" displayName="BlueColor"/>
    </Enum>
</Enums>

附: 有什么办法可以简化这个查询?

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    这是一个使用 XML Linq 的方法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Xml;
    using System.Xml.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                string input = 
                    "<Enums>" +
                        "<Enum name=\"Color\" guid=\"{2C68F947-3103-4F3C-9855-60F289B3A039}\">" +
                            "<Enumerator name=\"Red\" displayName=\"Red Color\"/>" +
                            "<Enumerator name=\"Green\" displayName=\"Green Color\" />" +
                            "<Enumerator name=\"Blue\" displayName=\"BlueColor\"/>" +
                        "</Enum>" +
                    "</Enums>";
    
                XDocument doc = XDocument.Parse(input);
    
                var results = doc.Descendants("Enum").Select(x => new {
                    name = x.Attribute("name").Value,
                    guid = x.Attribute("guid").Value,
                    enumerator = x.Elements("Enumerator").Select(y => new {
                        name = y.Attribute("name").Value,
                        displayName = y.Attribute("displayName").Value,
                        parent = x
                    }).ToList()
                }).ToList();
            }
        }
    }
    ​
    

    【讨论】:

      【解决方案2】:

      最简单的方法是使用另一个投影:

      var result = sdEnumTypes.Select(e =>
      {
          e.Enumerators.ForEach(enumerator => enumerator.Enum = e);
          return e;
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        相关资源
        最近更新 更多