У меня есть список объекта, который должен быть отсортирован в зависимости от трех различных свойств объекта. Пример
CLass Object1{ Property1 , Property2, Property3}
ListObj = IEnumerable<Object1>
Foreach ( item in ListObj){
if (item.Property1 == true)
item goes at top of list
if(item.Property2 == true)
item goes end of list
if(item.Property3 == true)
item can go anywhere.
}
Список конца должен быть объектами с Property1 = верный сопровождаемый объектами с Property2 = верный сопровождаемый объектами с Property3 = верный
Почему бы не использовать LINQ?
var orderedList =
ListObj.OrderByDescending(x => x.Property1)
.ThenByDescending(x => x.Property2);
В вашем собственном заголовке уже сказано все: реализуйте собственный IComparer
и передайте его OrderBy метод расширения:
var orderedItems = ListObj.OrderBy(obj => obj, customComparer);
Вы можете сделать вещи более аккуратными, если определите этот тип:
public class ComparisonComparer<T> : IComparer<T>
{
private readonly Comparison<T> _comparison;
public ComparisonComparer(Comparison<T> comparison)
{
_comparison = comparison;
}
public int Compare(T x, T y)
{
return _comparison(x, y);
}
}
Который позволяет вам определять сравнение в строке с оператором LINQ, используя лямбда-выражение.
Я думаю, вы хотите определить функцию сравнения, в которой вы можете определять ранг между любыми двумя элементами в список.
int CompareObject1(Object1 left, Object1 right)
{
// TODO: cases where your items are null
// compare Property1 values
if (left.Property1)
{
if (right.Property1)
{
// items at same rank
return 0;
}
else
{
// left item is higher rank than right
return -1;
}
}
else if (right.Property1)
{
// right item is higher rank than left
return 1;
}
// Property1 doesn't indicate position, move along
// TODO: repeat for Property2
// Property2 doesn't indicate position, move along
// TODO: repeat for Property3
// if we get here, no determination can
// be made/don't bother to move anything
return 0;
}
возвращаемое значение указывает, должен ли левый или правый объект быть ранжирован выше: -1 или 1 (или 0 для предпочтения). просто убедитесь, что вы покрываете все свои условия.
, то вы можете использовать это как
List<Object1> foo = new List<Object1>() { <items...> };
foo.Sort(CompareObject1);
, если список заканчивается в обратном направлении, я, вероятно, перевернул знаки в функции сравнения. ваши правила сортировки противоречивы, поэтому я позволю вам отсортировать Property2 и Property3.
Это должно обеспечить требуемую сортировку (в соответствии с кодом, а не приведенным ниже утверждением).
ListObj.Where(x => x.Property1 == true)
.Concat(ListObj.Where(x => x.Property1 == false && x.Property2 == false))
.Concat(ListObj.Where(x => x.Property2 == true));