Сортировка списка С# по двум столбцам

У меня есть список настраиваемых объектов С#, который мне нужно отсортировать по двум различным переменным: один является логическим, а другой - строкой. Я могу сортировать по одному из критериев, но мне трудно понять, как их сочетать. Сначала должны быть все логические значения (CheckedIn), а затем имя для каждого из значений. Сейчас я использую

result.Sort((x, y) => string.Compare(x.CheckedIn.ToString(), y.CheckedIn.ToString()));
result.Sort((x, y) => string.Compare(x.LastName, y.LastName));

Но как я могу объединить то, чтобы мои результаты были похожи

CheckedIn-Name
No - Aames
No - Smith
Yes - Barnes
Yes - Peters

Ответ 1

result.Sort((x,y) => x.CheckedIn==y.CheckedIn ? 
  string.Compare(x.LastName, y.LastName) : 
  (x.CheckedIn ? -1 : 1) );

Ответ 2

используйте linq.

если у вас есть список L объектов класса

public class temp
{
public bool x;
public string y;
}

затем используйте:

L.orderby(a=>a.x).thenby(a=>a.y);

вы можете связать его так, как вам нравится.

Ответ 3

var sortResult = result.OrderBy(a => a.CheckedIn).ThenBy(a => a.LastName).ToList();

Ответ 4

У меня есть класс, который создает CSV файлы, используя List<List<string>> в переменной _Records. Мне нужен был способ, чтобы отсортировать его после факта, и LINQ не был хорош.

Это то, что я создал как мульти-сортировку, передавая индексы столбцов, которые я хотел сортировать.

public void OrderBy(params int[] columnIndexes)
{
    _Records.Sort((x, y) =>
    {
        foreach (int i in columnIndexes)
        {
            int result = string.Compare(x[i], y[i]);
            if (result != 0)
                return result;
        }
        return 0;
    });
}

Тогда использование было бы...

csv.OrderBy(1, 3, 5);

Ответ 5

Вот метод расширения, который я написал для сортировки списка по любому количеству ключей:

public static class ListExtensions
{
    public static void SortBy<T>(this List<T> list, params Expression<Func<T, IComparable>>[] keys)
    {
        if (list == null)
            throw new ArgumentNullException("list");
        if(keys == null || !keys.Any())
            throw new ArgumentException("Must have at least one key!");
        list.Sort((x, y) => (from selector in keys 
                             let xVal = selector.Compile()(x) 
                             let yVal = selector.Compile()(y) 
                             select xVal.CompareTo(yVal))
                             .FirstOrDefault(compared => compared != 0));
    }
}

Применение:

var List<Person> persons = GetPersons();
myList.SortBy(p => p.LastName, p => p.FirstName);

Обратите внимание, что это примерно эквивалентно: myList = myList.OrderBy(p => p.LastName).ThenBy(p => p.FirstName).

Ответ 6

Я смог сделать что-то быстро/грязно, сделав это. Поскольку оба столбца являются текстом, просто добавьте их вместе, чтобы отсортировать их в один быстрый проход.

this.Project.Tasks.Sort((x, y) => String.Compare((x.Assignee + x.Task), (y.Assignee + y.Task)));

Ответ 7

Цепочка сравнения в С#

Здесь мое решение цепи сравнения. Он позаботится об агрегировании всех классов сравнения, которые вы заинтересованы в сортировке. шаблон компоновщика позволяет легко сортировать столбцы и получать отсортированный список в обратном порядке.