3

一意の値のグループを選択するクエリを作成しようとしています。値をグループ化し、個別の値を選択する方法は知っていますが、考慮される要素の順序に関係なく、個別の値のグループを選択する方法がわかりません。より正確に:

私の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+値4

値2+値3+値4+値1

これらの 2 つの値のセットは、値の一部またはすべてが異なる場合にのみ一意である必要があります。

よろしくお願いいたします。

4

2 に答える 2

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

于 2012-09-24T10:50:02.720 に答える
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();
于 2012-09-24T10:39:28.623 に答える