如何使用 LINQ 3 用字典填充类
本文关键字:字典 填充 何使用 LINQ | 更新日期: 2023-09-27 18:31:47
第三次约会 如何使用 LINQ 用字典填充类!
与此处解决的问题相关:如何使用 LINQ 用字典填充类
在这里: 如何使用 LINQ 2 用字典填充类
我对 LINQ 很烂...
我在尝试填充一个Dictionary<int, Dictionary<int, float>>
时遇到了另一个问题,其中第一个int
是一个索引,从0
开始,第二个int
是元素staticDrop
的idPattern
属性,浮点数是元素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
或其他,所以我不知道如何放置嵌套选择。
像这样更改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 序列化程序将为您完成所有艰苦的工作。