C# 从XElement获取2个属性以创建字典LINQ

C# 从XElement获取2个属性以创建字典LINQ,c#,linq,C#,Linq,我尝试使用一个属性作为键,另一个属性作为值。如果我使用(示例中xDoc是XDocument对象): Dictionary test=xDoc.subscriptions() .Where(t=>t.Name==“someelement”) .ToDictionary(t=>t.Attribute(“myattr”).Value.ToString(); 我得到一个字典,其中myattr值作为键(这是我想要的),但整个XElement对象作为值 我想做的是,选择第二个属性作为每个字典项的value

我尝试使用一个属性作为键,另一个属性作为值。如果我使用(示例中xDoc是XDocument对象):

Dictionary test=xDoc.subscriptions()
.Where(t=>t.Name==“someelement”)
.ToDictionary(t=>t.Attribute(“myattr”).Value.ToString();
我得到一个字典,其中myattr值作为键(这是我想要的),但整个XElement对象作为值

我想做的是,选择第二个属性作为每个字典项的value属性,但似乎无法解决这个问题

是否可以在1 Linq语句中完成所有这些操作?好奇吸引了我


干杯

是的,您可以传入另一个表达式以选择所需的值:

Dictionary<string,string> test = xDoc.Descendants()
    .Where(t => t.Name == "someelement")
    .ToDictionary(
        t => t.Attribute("myattr").Value.ToString(), 
        t => t.Attribute("otherAttribute").Value.ToString());
Dictionary test=xDoc.subscriptions()
.Where(t=>t.Name==“someelement”)
.ToDictionary(
t=>t.Attribute(“myattr”).Value.ToString(),
t=>t.Attribute(“otherAttribute”).Value.ToString();

是的,您可以传入另一个表达式以选择所需的值:

Dictionary<string,string> test = xDoc.Descendants()
    .Where(t => t.Name == "someelement")
    .ToDictionary(
        t => t.Attribute("myattr").Value.ToString(), 
        t => t.Attribute("otherAttribute").Value.ToString());
Dictionary test=xDoc.subscriptions()
.Where(t=>t.Name==“someelement”)
.ToDictionary(
t=>t.Attribute(“myattr”).Value.ToString(),
t=>t.Attribute(“otherAttribute”).Value.ToString();

调用.ToDictionary()中的强制转换将翻转对象定义中的参数

您所要做的就是删除它并添加一个identity select,它应该可以工作

Dictionary<string, XElement> test = xDoc.Descendants()
            .Where<XElement>(t => t.Name == "someelement")
            .ToDictionary(t => t.Attribute("myattr").Value.ToString(), t => t);
Dictionary test=xDoc.subscriptions()
.Where(t=>t.Name==“someelement”)
.ToDictionary(t=>t.Attribute(“myattr”).Value.ToString(),t=>t);

调用.ToDictionary()中的强制转换将翻转对象定义中的参数

您所要做的就是删除它并添加一个identity select,它应该可以工作

Dictionary<string, XElement> test = xDoc.Descendants()
            .Where<XElement>(t => t.Name == "someelement")
            .ToDictionary(t => t.Attribute("myattr").Value.ToString(), t => t);
Dictionary test=xDoc.subscriptions()
.Where(t=>t.Name==“someelement”)
.ToDictionary(t=>t.Attribute(“myattr”).Value.ToString(),t=>t);

效果很好!谢谢你的回答,但是为什么演员阵容会改变呢?如果我在第二个表达式中使用了cast,那么它所寻找的是一个比较器。@AndyC,你想使用什么。ToDictionary有一些不同的重载,其中一个重载使用了比较器。在我的原始代码中,去掉这个重载就可以工作了。只是好奇为什么会这样。@AndyC,那是因为您显式地声明了字典的类型,所以扩展方法希望值为XElement。当它看到另一个类型时,它会尝试其他重载,然后因为不匹配而抱怨。通常,您不应该使用LINQ显式地声明扩展方法上的类型。这样做只会增加视觉噪音。效果很好!谢谢你的回答,但是为什么演员阵容会改变呢?如果我在第二个表达式中使用了cast,那么它所寻找的是一个比较器。@AndyC,你想使用什么。ToDictionary有一些不同的重载,其中一个重载使用了比较器。在我的原始代码中,去掉这个重载就可以工作了。只是好奇为什么会这样。@AndyC,那是因为您显式地声明了字典的类型,所以扩展方法希望值为XElement。当它看到另一个类型时,它会尝试其他重载,然后因为不匹配而抱怨。通常,您不应该使用LINQ显式地声明扩展方法上的类型。这样做只会增加视觉噪音。您的.ToDictionary()中的第二个参数是超级参数。t=>t在单参数重载中是隐式的,它只接受keySelector。ToDictionary()中的第二个参数是超级参数。t=>t在单参数重载中是隐式的,它只接受keySelector。