Daily Archives: March 4th, 2009

Sorting a generic List object by passing an IComparer object to the Sort method doesn’t preserve order of items that are equal.

List<ArtifactDetails> recordset = GetArtifactsFromProvider();
recordset.Sort(new Core.Comparer<ArtifactDetails>(sortExpression));

http://msdn.microsoft.com/en-us/library/234b841s(VS.80).aspx

This method uses System.Array.Sort, which uses the QuickSort algorithm. This implementation performs an unstable sort; that is, if two elements are equal, their order might not be preserved. In contrast, a stable sort preserves the order of elements that are equal.

http://www.csharp411.com/c-stable-sort/

http://en.wikipedia.org/wiki/Stable_sort#Classification

What are our options if we want a stable sort?

  • Write our own sort algorithm that is a stable sort so that the original order is preserved. There are several n log n sorts that are stable sorts; they take more memory than the QuickSort though.

Or if we don’t want the order to change if the sortExpression was empty?

  • Check for an empty string and use a default sort order like uid or whatever the primary key is.
  • Check sortExpression for an empty string and just not call sort.
  • Write a SortList function that does the checking for an empty sortExpression.
protected static List<T> SortList<T>(List<T> list, string sortExpression)
{
    if (!string.IsNullOrEmpty(sortExpression)) list.Sort(new Core.Comparer<T>(sortExpression));
    return list;
}

Then instead of using the Sort call at the top of this post use this call.

List<ArtifactDetails> recordset = GetArtifactsFromProvider();
recordset = SortList(recordset, sortExpression);

Are there other better options? Maybe, but this gets the job done without a lot of extra code.

There are several ways to show/hide ASP.NET controls, one option is server side using the Visible attribute. However, if you need to control the visibility via JavaScript, the easiest way is with CSS. See the following code:

function ShowHideElement(idText, hide)
{
    var lblText = document.getElementById(idText);
    if (lblText == null) return;
    if(hide)
    {
        lblText.style.visibility = "hidden";
    }
    else
    {
        lblText.style.visibility = "visible";
    }
}