patterncsharpMinor
Reorder objects based on provided enumerable order
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
id.
Is there a more elegant solution that I'm missing?
based on an IEnumerable of ids get those objects from a data store and
set their
DisplayOrder property to the position of the associatedid.
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.