我有一个对象列表,需要根据对象的三个不同属性进行排序。 实施例
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 = true的对象,后跟Property2 = true的对象,后跟Property3 = true的对象
答案 0 :(得分:8)
为什么不使用LINQ?
var orderedList =
ListObj.OrderByDescending(x => x.Property1)
.ThenByDescending(x => x.Property2);
答案 1 :(得分:5)
您自己的标题已经说明了一切:实施自定义IComparer<Object1>
并将其传递给OrderBy扩展程序:
var orderedItems = ListObj.OrderBy(obj => obj, customComparer);
答案 2 :(得分:2)
如果您定义此类型,您可以自己做得更整洁:
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);
}
}
这允许您使用lambda表达式定义与LINQ语句内联的比较。
答案 3 :(得分:1)
这应该提供所需的排序(根据代码,而不是下面的声明)。
ListObj.Where(x => x.Property1 == true)
.Concat(ListObj.Where(x => x.Property1 == false && x.Property2 == false))
.Concat(ListObj.Where(x => x.Property2 == true));
答案 4 :(得分:1)
我认为您想要定义一个比较函数,您可以在其中确定列表中任意两个项目之间的等级。
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进行排序。