Теперь я понимаю (благодаря тем, кто ответил), что использование настраиваемого IComparer, подобного приведенному ниже, устраняет необходимость использовать своп. Это решение гарантирует порядок и будет работать правильно, когда один из 5 возможных значения отсутствуют.
class CustomOrder : IComparer<Series>
{
static readonly Dictionary<string, int> dictionary =
new Dictionary<string, int>()
{
{"Excellent", 1},
{"Very Good", 2},
{"Average", 3},
{"Bad", 4},
{"Very Bad", 5}
};
public int Compare(Series x, Series y)
{
return dictionary[x.Name].CompareTo(dictionary[y.Name]);
}
}
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Series[] sortedSeries = chart.Series.ToArray();
Array.Sort(sortedSeries, new CustomOrder());
}
}
Старый раствор с использованием свопа (для справки)
Мне это не нравится, но, похоже, это работает. У кого-нибудь есть идеи получше?
int count = collection.Count;
// don't need to swap if there is only one element
if (count > 1)
{
// have to run once for each letter
sortCollection(count);
sortCollection(count);
sortCollection(count);
sortCollection(count);
}
private void sortCollection(int count)
{
if (collection.Contains(collection['c']))
{
// take care of last element
collection.Swap(count - 1, collection.IndexOf(collection['c']));
}
if (collection.Contains(collection['a']) && collection.Contains(collection['b']))
{
// take care of middle elements
if(collection[1] != collection['b'])
collection.Swap(collection['a'], collection['b']);
}
if (collection.Contains(collection['d']))
{
// take care of first element
if(collection[0] != collection['d'])
collection.Swap(0, collection.IndexOf(collection['d']));
}
}