Ответ 1
result.Sort((x,y) => x.CheckedIn==y.CheckedIn ?
string.Compare(x.LastName, y.LastName) :
(x.CheckedIn ? -1 : 1) );
У меня есть список настраиваемых объектов С#, который мне нужно отсортировать по двум различным переменным: один является логическим, а другой - строкой. Я могу сортировать по одному из критериев, но мне трудно понять, как их сочетать. Сначала должны быть все логические значения (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
result.Sort((x,y) => x.CheckedIn==y.CheckedIn ?
string.Compare(x.LastName, y.LastName) :
(x.CheckedIn ? -1 : 1) );
используйте linq.
если у вас есть список L объектов класса
public class temp
{
public bool x;
public string y;
}
затем используйте:
L.orderby(a=>a.x).thenby(a=>a.y);
вы можете связать его так, как вам нравится.
var sortResult = result.OrderBy(a => a.CheckedIn).ThenBy(a => a.LastName).ToList();
У меня есть класс, который создает 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);
Вот метод расширения, который я написал для сортировки списка по любому количеству ключей:
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)
.
Я смог сделать что-то быстро/грязно, сделав это. Поскольку оба столбца являются текстом, просто добавьте их вместе, чтобы отсортировать их в один быстрый проход.
this.Project.Tasks.Sort((x, y) => String.Compare((x.Assignee + x.Task), (y.Assignee + y.Task)));
Здесь мое решение цепи сравнения. Он позаботится об агрегировании всех классов сравнения, которые вы заинтересованы в сортировке. шаблон компоновщика позволяет легко сортировать столбцы и получать отсортированный список в обратном порядке.