Структура перестановочных данных - PullRequest
0 голосов
/ 24 октября 2011

Мне нужна помощь в отношении перестановок.

Моя проблема заключается в следующем: в нашей системе есть различные устройства, на которых работают различные программные компоненты.Я заинтересован в нахождении всех перестановок (уникальных комбинаций) версий указанных компонентов, и в итоге получаю список кортежей или структур аля это

struct Permutation
{
    IComparable Software1{ get; set; }
    IComparable Software2{ get; set; }
    IComparable Software3{ get; set; } 
}

Затем получим список, подобный этому:

Software1: v1
Software2: v1
Software3: v1

Software1: v1
Software2: v2
Software3: v1

Software1: v2
Software2: v1
Software3: v1

Программное обеспечение существует на различных компонентах, организованных в виде древовидной структуры (Узел-> Элемент).Тип дочернего узла говорит мне, какое программное обеспечение искать

 Node->Root (L0)
    Node->Parent (L1) 
       Node->ChildType1 (L2): has property Software1, Software2
       Node->ChildType2 (L2): has property Software3

Я могу легко перемещаться по дереву с помощью node.Children (IList<Node>) и node.Parent (Node).

Я хочу перебрать итерацию дерева и составить список всех перестановок.Есть ли хорошая структура данных в .net Framework, которую я могу использовать для этого, или у кого-нибудь есть предложения по ее решению?

1 Ответ

1 голос
/ 24 октября 2011

Мои мысли были бы такими:

    var list = from parent in root.Parents()
               select new Permutation
                  {
                      Software1 = parent.ChildA.Software1,
                      Software2 = parent.ChildA.Software2,
                      Software3 = parent.ChildB.Software3,
                  };

    foreach (var perm in list.Distinct())
    {
       // do something 
    }

Вы хотите убедиться, что перестановка сравнима и уравновешена, просто отлично:

struct Permutation : IEquatable<Permutation>, IComparable<Permutation>
{
    public IComparable Software1 { get; set; }
    public IComparable Software2 { get; set; }
    public IComparable Software3 { get; set; }

    public bool Equals(Permutation other)
    {
        return Equals(other.Software1, Software1) && Equals(other.Software2, Software2) && Equals(other.Software3, Software3);
    }

    public int CompareTo(Permutation other)
    {
        int cmp = 0;
        if (0 == cmp) cmp = other.Software1.CompareTo(Software1);
        if (0 == cmp) cmp = other.Software2.CompareTo(Software2);
        if (0 == cmp) cmp = other.Software3.CompareTo(Software3);
        return cmp;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (obj.GetType() != typeof(Permutation)) return false;
        return Equals((Permutation)obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (Software1 != null ? Software1.GetHashCode() : 0);
            result = (result * 397) ^ (Software2 != null ? Software2.GetHashCode() : 0);
            result = (result * 397) ^ (Software3 != null ? Software3.GetHashCode() : 0);
            return result;
        }
    }

    public static bool operator ==(Permutation left, Permutation right)
    {
        return left.Equals(right);
    }

    public static bool operator !=(Permutation left, Permutation right)
    {
        return !left.Equals(right);
    }
}

Я использовал resharper, чтобы сделать там работу:)

...