【发布时间】:2013-03-14 06:28:22
【问题描述】:
我正在尝试使用 LINQ 获取不同值的字典。 我试过用这个:
var roleRefList =
xDocument.Root.Descendants()
.Where(x => x.Name.LocalName.Equals("roleRef") &&
!string.IsNullOrEmpty(Convert.ToString(x.Attributes().FirstOrDefault(a => a.Name.LocalName.Equals("roleURI")))) &&
!string.IsNullOrEmpty(Convert.ToString(x.Attributes().FirstOrDefault(a => a.Name.LocalName.Equals("href")))))
.Select(l => new {
roleUri = l.Attributes().FirstOrDefault(a => a.Name.LocalName.Equals("roleURI")).Value,
href = l.Attributes().FirstOrDefault(a => a.Name.LocalName.Equals("href")).Value
})
.Distinct()
.ToDictionary(a => a.roleUri);
这里的问题是,当roleUri 中有重复条目时,就会发生错误。
我正在解析 XML 文档并制作 xElement 属性字典 roleUri 和 roleref(如果它们存在于 xElement 中)。
另一种解决方法是使用 for 循环:
Dictionary<string, string> roleRefList = new Dictionary<string, string>();
foreach (XElement element in xDocument.Root.Descendants().Where(x => x.Name.LocalName.Equals("roleRef")))
{
string roelUri = Convert.ToString(element.Attributes().FirstOrDefault(a => a.Name.LocalName.Equals("roleURI")));
string href = Convert.ToString(element.Attributes().FirstOrDefault(a => a.Name.LocalName.Equals("href")));
if (!string.IsNullOrEmpty(roelUri) && !string.IsNullOrEmpty(href) && !roleRefList.ContainsKey(roelUri))
{
roleRefList.Add(roelUri, href);
}
}
但我想使用 LINQ 来实现。
【问题讨论】:
-
如果你有工作代码,为什么要使用 Linq 来实现这个?
-
使用节点本地名称的原因是什么?您的 xml 声明了不同的命名空间?你能展示你正在解析的xml的例子吗?
-
所以根据您的循环:如果
roleUri存在不止一次,您只需要字典中的第一个实例(及其roleRef)吗?我做对了吗? -
@Marteen 因为 linq 更快,所以需要这样做。
-
@lazyberezovsky 如果我尝试使用命名空间但它给了我错误。所以我使用 name.Localname
标签: c# xml linq linq-to-xml