2012-09-24 22 views
2

我想建立一個查詢,選擇唯一的值組。我知道如何對值進行分組並選擇不同的值,但我不知道如何選擇不同的值組,以確保所考慮元素的順序不變。更確切地說:如何區分不同的值?

我的XML是這樣的:

<A> 
    <B type="1">value1</prop> 
    <B type="2">value2</prop> 
    <B type="3">value3</prop> 
    <B type="4">value4</prop> 
<C> 
    <D>XXX</D> 
</C> 
<C> 
    <D>YYY</D> 
</C> 
</A> 

<A> 
    <B type="3">value3</prop> 
    <B type="4">value4</prop> 
    <B type="2">value2</prop> 
<C> 
    <D>XXX</D> 
</C> 
<C> 
    <D>YYY</D> 
</C> 
</A> 

在這裏我想提出<B>值的組從所有<A>節點,只選擇唯一值的集合。舉例來說,在這裏:

值1 +值2 +值3 + VALUE4

值2 +值3 + VALUE4 +值1

這兩組值應該是,如果部分或全部的唯一獨特這些值是不同的。

非常感謝您的幫助。

+0

使用LINQ to XML。 – adatapost

回答

2

以下工作:

var doc = XDocument.Parse(xml); 

var comparer = new ElementsComparer(); 

var result = doc.Descendants("B") 
       .GroupBy(x => x.Parent) 
       .Distinct(comparer); 

class ElementsComparer : IEqualityComparer<IGrouping<XElement, XElement>>, 
         IEqualityComparer<XElement> 
{ 
    public bool Equals(XElement lhs, XElement rhs) 
    { 
     return lhs.Value.Equals(rhs.Value); 
    } 

    public bool Equals(IGrouping<XElement, XElement> lhs, 
         IGrouping<XElement, XElement> rhs) 
    { 
     var x = lhs.OrderBy(a => a.Value); 
     var y = rhs.OrderBy(a => a.Value); 
     return x.SequenceEqual(y, this); 
    } 

    public int GetHashCode(XElement obj) 
    { 
     return obj.Value.GetHashCode(); 
    } 

    public int GetHashCode(IGrouping<XElement, XElement> obj) 
    { 
     return 0; 
    } 
} 

這將返回不同的羣體。如果組中的元素與另一組中的元素具有相同的值,則將組視爲與另一組相同。
不幸的是,我們需要一個完整的IEqualityComparer實現來實現這一點。

+0

非常感謝Daniel。 – marynarz

0

嘗試

var xDocument = XDocument.Parse(/*Your XML here*/); 
var vals = 
    //Find all A-Elements 
    xDocument.Root.Elements("A") 
     //Select all their B-Elements to one collection 
     .SelectMany(a => a.Elements("B")) 
     //Group the B-Items by their value 
     .GroupBy(element => element.Value) 
     //Select the keys of the IGrouping<TValue, XElement> 
     .Select(element => element.Key) 
     //Distinct them 
     .Distinct(); 
+1

這不會返回任何組。用他的示例XML返回4個節點。而不是兩組中的7個節點。 –

+0

編輯:)感謝您的提示 –

+0

您現在錯過了一個關閉'''。 –

相關問題