Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ c组合和更新两个xml文件#_C#_Xml_Linq - Fatal编程技术网

C# 如何使用LINQ c组合和更新两个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文件:

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">
      </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"));