На основании обсуждения в комментариях, когда карта имеет несколько цветов, вы хотите выбрать один цвет (тот, который появляется первым в списке приоритетов) и отсортировать его на этом основании.
// Higher-priority colours come first
var coloursPriority = new List<string>() { "W", "U", "B", "R", "G" };
// Turn the card's colour into an index. If the card has multiple colours,
// pick the smallest of the corresponding indexes.
cards.OrderBy(card => card.Colours.Select(colour => coloursPriority.IndexOf(colour)).Min());
Отвечая на обсуждение в комментариях: если вы хотите отсортировать карточки сначала по цвету с наивысшим приоритетом, , а затем по цвету с наивысшим приоритетом и т. Д., То этодостаточно эффективный способ сделать это:
public class CardColourComparer : IComparer<List<int>>
{
public static readonly CardColourComparer Instance = new CardColourComparer();
private CardColourComparer() { }
public int Compare(List<int> x, List<int> y)
{
// Exercise for the reader: null handling
// For each list, compare elements. The lowest element wins
for (int i = 0; i < Math.Min(x.Count, y.Count); i++)
{
int result = x[i].CompareTo(y[i]);
if (result != 0)
{
return result;
}
}
// If we're here, then either both lists are identical, or one is shorter, but it
// has the same elements as the longer one.
// In this case, the shorter list wins
return x.Count.CompareTo(y.Count);
}
}
Тогда
// Higher-priority colours come first
var coloursPriority = new List<string>() { "W", "U", "B", "R", "G" };
cards.OrderBy(card =>
card.Colours.Select(colour => coloursPriority.IndexOf(colour)).OrderBy(x => x).ToList(),
CardColourComparer.Instance);
Это использует тот факт, что OrderBy
применяет делегат keySelector
к каждому элементу только один раз.Мы используем это, чтобы превратить каждую карту в список, содержащий приоритет каждого из ее цветов (более высокие приоритеты имеют более низкие значения), упорядоченные сначала с более приоритетными.Затем мы сортируем эти ключи, используя пользовательский компаратор, который сравнивает два из этих списков.
Обратите внимание, что это не заботится о порядке цветов, связанных с каждой картой: [W, U]
будет сортировать так же, как [U, W]
.Чтобы принять во внимание заказ (например, [W]
предшествует [W, U]
до [U, W]
, сделайте следующее:
cards.OrderBy(card =>
card.Colours.Select(colour => coloursPriority.IndexOf(colour)).ToList(),
CardColourComparer.Instance);