2013-08-16 37 views
-1

我有一个XML文档有没有简单的方法来过滤使用linq的独特元素?

<NumSet> 
    <num>1</num> 
    <num>2</num> 
    <num>2</num> 
    <num>3</num> 
    </NumSet> 

我想露面独特的元素,即1和3未不同这也将带出2 如何做到这一点?我必须使用Group吗?有没有简明的方法来做到这一点?

+3

SO用户,如果您打算downvote,*请*解释您为什么向用户做了这件事,以便他们可以从错误中学习。否则,他们不知道他们的错误是什么。我个人不知道为什么这是被拒绝的......这很短,但完全可以理解。 – Sheridan

+1

@Sheridan - 我完全同意。谁低估可能是因为没有显示任何代码(即没有显示的尝试),但我希望SO会实施一个系统,迫使downvoters发表评论,所以至少人们可以学习(如果原因是有效的)。 – Tim

回答

1

你是对的,你可以使用GroupBy和滤波器组通过使用Count() == 1只有一个项目:

var output = XDocument.Load(xmlFile) 
         .Descendants("num") 
         .Select(e => e.Value) 
         .GroupBy(x => x) 
         .Where(g => g.Count() == 1) 
         .Select(g => g.Key); 
1
XElement xe = XElement.Parse(@"<NumSet><num>1</num><num>2</num><num>2</num><num>3</num></NumSet>"); 
var query = xe.Elements("num") 
       .GroupBy(x => x.Value) 
       .Where(x=>x.Count()==1) 
       .Select (x => x); 
1

要做到你需要什么,我会说,是的,你需要使用GrouBy,然后计算每个组中的元素,并返回仅包含一个元素的元素。在代码中,这将转化为:

var query = lst.GroupBy(x => x) 
    .Where(x => x.Count() == 1) 
    .Select(x => x.Key); 
+0

所以语法必然很复杂。如果我想加入与另一个查询,我应该先使用GroupJoin或过滤然后加入? –

+0

我不会说这很复杂:)想想它的作用:它将元素分组,计算每个组中有多少个元素,并返回只有一个结果的元素。对于第二个问题......它取决于你想要加入的查询,但可能是最好的问题,在一个新的问题。 – Save

相关问题