如何使用 LINQ 3 用字典填充类

本文关键字:字典 填充 何使用 LINQ | 更新日期: 2023-09-27 18:31:47

第三次约会 如何使用 LINQ 用字典填充类!

与此处解决的问题相关:如何使用 LINQ 用字典填充类

在这里: 如何使用 LINQ 2 用字典填充类

我对 LINQ 很烂...

我在尝试填充一个Dictionary<int, Dictionary<int, float>>时遇到了另一个问题,其中第一个int是一个索引,从0开始,第二个int是元素staticDropidPattern属性,浮点数是元素staticDrop的内容。

有关 XML 代码,请参阅第一篇文章。

战利品简介.cs

public class LootProfile
{
    /*
    dynamicDrop multipli non definiti
    */
    public string name;
    public int dynamicDropNumber; //  = 3 
    public Dictionary<int, float> dynamicDrop;  // 70, 40, 10
    public Dictionary<ObjectType, float> dynamicType;
    public Dictionary<Rarity, float> dynamicDropRarity; // "Common" - 60, "Uncommon" - 26, "Rare" - 12, "Epic" - 2
    public int staticDropNumber; // = 2
    public Dictionary<int, Dictionary<int, float>> staticDrop;  // 0 - idPattern - prob
    public Faction faction;
    public Location location;
}

导入器XML

var query = from item in xml.Root.Elements("LootProfile")
                select new LootProfile()
                {
                    name = (string)item.Attribute("name"),
                    dynamicDropNumber = (int)item.Element("dynamicDropNumber"),
                    dynamicDrop = item.Elements("dynamicDrop")
                        .Select((Item, Index) => new { Item, Index })
                        .ToDictionary(x => x.Index, x => float.Parse(x.Item.Value)),
                    dynamicType = item.Elements()
                        .Where(x => x.Name.LocalName.StartsWith("dynamicType"))
                        .ToDictionary(
                            x => (ObjectType)Enum.Parse(typeof(ObjectType),
                            x.Name.LocalName.Substring("dynamicType".Length)),
                            x => float.Parse(x.Value)),
                    dynamicDropRarity = item.Elements()
                        .Where(x => x.Name.LocalName.StartsWith("dynamicRarity"))
                        .ToDictionary(
                            x => (Rarity)Enum.Parse(typeof(Rarity),
                            x.Name.LocalName.Substring("dynamicRarity".Length)),
                            x => float.Parse(x.Value)),
                    staticDropNumber = (int)item.Element("staticDropNumber")
                 };
    return query.ToList<LootProfile>();

我目前的尝试如下:

   staticDrop = item.Elements("staticDrop")
                        .Select((Item, Index) => new { Item, Index })
                        .ToDictionary(x => x.Index, x => (item.Attribute("idPattern"). //here miss the second .Select for get idPattern Attribute and use Item.Value!

但似乎不接受另一个.Select或其他,所以我不知道如何放置嵌套选择。

如何使用 LINQ 3 用字典填充类

像这样更改staticDrop的定义:

public Dictionary<int, Tuple<int, float>> staticDrop;

然后,您可以像这样查询 XML:

var query = xml.Elements("LootProfile")
    .Select(item => new LootProfile()
    {
        //...
        staticDrop = item.Elements("staticDrop")
            .Select((Item, Index) => new { Item, Index })
                    .ToDictionary(
                        x => x.Index,
                        x => new Tuple<int, float>(
                            int.Parse(x.Item.Attribute("idPattern").Value),
                            float.Parse(x.Item.Value))),
        //..
    });

Tuple类允许您存储两个或多个具有特定类型的项。

我认为,如果您可以控制XML,则应考虑使用XML序列化。可以使 LootProfile Xml 序列化友好,然后使用 XmlSerializer 类将其序列化为 XML 或从 XML 文件反序列化。

如果这样做,则 Xml 序列化程序将为您完成所有艰苦的工作。