Implementing multiple custom sorts
Without getting into why you designed your business logic this way (I would've made Pars a separate class or struct, to accommodate the complexity), I guess this is somewhat a decent approach.

By using an IComparer&lt;T&gt;, you can implement whatever logic you need, thus separating the concern of sorting Pars into its own place.

I've used a predefined list of characters (in C#, the simplest list of char is string, but you can use any type that has an IndexOf method) in order to have a single, distinct source of truth for the order of the chars that can be easily modified without breaking anything. I've named it PairOrder for lack of a better name, feel free to name it whatever you like. 

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
  public static void Main()
  {
    var data = new[] {
      new Result { Score = 110, Pars = "3C" },
      new Result { Score = -200, Pars = "4Hx" },
      new Result { Score = -100, Pars = "3Hx" },
      new Result { Score = -100, Pars = "3Sx" },
      new Result { Score = 400, Pars = "3N" }
    };

    var sortedByScore = data.OrderBy(item =&gt; item.Score)
      .ThenBy(item =&gt; item.Pars, new ParsComparer());

    Console.WriteLine("Sorting by Score first");
    foreach (var item in sortedByScore)
    {
      Console.WriteLine(item);
    }

    var sortedByPars = data.OrderBy(item =&gt; item.Pars, new ParsComparer())
      .ThenBy(item =&gt; item.Score);

    Console.WriteLine("\nSorting by Pars first");
    foreach (var item in sortedByPars)
    {
      Console.WriteLine(item);
    }
  }
}

public class Result
{
  public int Score { get; set; }
  public string Pars { get; set; }

  public override string ToString()
  {
    return string.Format("Score: {0}; Pars: {1}", Score, Pars);
  }
}

public class ParsComparer : IComparer&lt;string&gt;
{
  private string ParsOrder = "CDHSN";

  public int Compare(string a, string b)
  {
    var delta = a[0].CompareTo(b[0]);

    if (delta == 0)
    {
      var indexA = ParsOrder.IndexOf(a[1]);
      var indexB = ParsOrder.IndexOf(b[1]);

      delta = indexA.CompareTo(indexB);
    }

    return delta;
  }
}


The output is what you expected:

Sorting by Score first
Score: -200; Pars: 4Hx
Score: -100; Pars: 3Hx
Score: -100; Pars: 3Sx
Score: 110; Pars: 3C
Score: 400; Pars: 3N

Sorting by Pars first
Score: 110; Pars: 3C
Score: -100; Pars: 3Hx
Score: -100; Pars: 3Sx
Score: 400; Pars: 3N
Score: -200; Pars: 4Hx


Disclaimer: it's been a while since I've written any significant C# code. There are probably better ways to write and organize this code.

I also don't make any promises regarding performance. I don't think you'll have any issues, but the IndexOf lookup might introduce a bottleneck, specially if the list of chars gets too big.