HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Reorder objects based on provided enumerable order

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
orderobjectsreorderprovidedenumerablebased

Problem

This code feels like it goes through too many conversions to accomplish my goal:


based on an IEnumerable of ids get those objects from a data store and
set their DisplayOrder property to the position of the associated
id.

Is there a more elegant solution that I'm missing?

public void ReorderElements(IEnumerable elementSks)
{
    var elementsToReorder = GetSession().QueryOver()
        .WhereRestrictionOn(de => de.DocumentElementSk).IsIn(elementSks.ToArray()).List();

    var elementOrder = elementSks.Select((sk, i) => new { Sk = sk, Order = i })
        .ToDictionary(p => p.Sk, p => p.Order);

    elementsToReorder.ToList()
        .ForEach(e => e.DisplayOrder = elementOrder[e.DocumentElementSk]);

    this.Save(elementsToReorder);
}

Solution

If the list on input is going to be short, or if performance doesn't matter to you, you can simplify the code by using IndexOf() instead of the dictionary:

public void ReorderElements(IEnumerable elementSks)
{
    var elementsToReorder = GetSession().QueryOver()
        .WhereRestrictionOn(de => de.DocumentElementSk).IsIn(elementSks.ToArray()).List();

    var elementOrder = elementSks.ToList();

    foreach(var element in elementsToReorder)
         element.DisplayOrder = elementOrder.IndexOf(element.DocumentElementSk);

    this.Save(elementsToReorder);
}

Code Snippets

public void ReorderElements(IEnumerable<int> elementSks)
{
    var elementsToReorder = GetSession().QueryOver<DocumentElement>()
        .WhereRestrictionOn(de => de.DocumentElementSk).IsIn(elementSks.ToArray()).List();

    var elementOrder = elementSks.ToList();

    foreach(var element in elementsToReorder)
         element.DisplayOrder = elementOrder.IndexOf(element.DocumentElementSk);

    this.Save(elementsToReorder);
}

Context

StackExchange Code Review Q#9782, answer score: 2

Revisions (0)

No revisions yet.