C# 如何使用LINQ c组合和更新两个xml文件#
我想合并这些简单的xml文件: result2.xml:C# 如何使用LINQ c组合和更新两个xml文件#,c#,xml,linq,C#,Xml,Linq,我想合并这些简单的xml文件: result2.xml: <?xml version="1.0" encoding="utf-8"?> <Sports> <Sport id="1"> </Sport> </Sports> 我期望的结果是: <?xml version="1.0" encoding="utf-8"?> <Sports> <Sport id="1">
<?xml version="1.0" encoding="utf-8"?>
<Sports>
<Sport id="1">
</Sport>
</Sports>
我期望的结果是:
<?xml version="1.0" encoding="utf-8"?>
<Sports>
<Sport id="1">
</Sport>
<Sport id="2">
</Sport>
</Sports>
但我明白了:
<?xml version="1.0" encoding="utf-8"?>
<Sports>
<Sport id="1">
</Sport>
<Sport id="1">
</Sport>
<Sport id="2">
</Sport>
</Sports>
你能建议如何使这个C代码适用于这种特殊情况吗?
我在阵列上试过了,效果很好
提前谢谢 因此,即使元素的
id
属性共享相同的值,它们仍然是不同的对象,Distinct
或Union
不会仅仅因为某些任意属性值相等而认为它们相等
如果需要执行“distinctBy”,可以使用以下模式(对相关属性进行分组,然后从每组中选择第一个元素):
请注意,我还将Union
替换为Concat
,因为Union
所做的额外(基于集合的插入)工作在这种情况下无效,因此我们可以使用效率更高的Concat
(Union all)
将其封装到扩展方法中可能是有意义的:
public static class LinqEx
{
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> src,
Func<T, TKey> keySelector)
{
return src.GroupBy(keySelector).Select(g => g.First());
}
}
<?xml version="1.0" encoding="utf-8"?>
<Sports>
<Sport id="1">
</Sport>
<Sport id="1">
</Sport>
<Sport id="2">
</Sport>
</Sports>
var combinedUnique = xml1.Descendants("Sport")
.Concat(xml2.Descendants("Sport"))
.GroupBy(xe => (int)xe.Attribute("id"))
.Select(g => g.First());
public static class LinqEx
{
public static IEnumerable<T> DistinctBy<T, TKey>(this IEnumerable<T> src,
Func<T, TKey> keySelector)
{
return src.GroupBy(keySelector).Select(g => g.First());
}
}
var combinedUnique = xml1.Descendants("Sport")
.Concat(xml2.Descendants("Sport"))
.DistinctBy(xe => (int)xe.Attribute("id"));