我目前正在使用列表中包含的对象类型中的'CompareTo'方法对C#列表进行排序。我想通过他们的WBS(工作分解结构)按升序排序所有项目,我可以使用以下代码很好地管理它:
public int CompareTo(DisplayItemsEntity other)
{
string[] instanceWbsArray = this.WBS.Split('.');
string[] otherWbsArray = other.WBS.Split('.');
int result = 0;
for (int i = 0; i < maxLenght; i++)
{
if (instanceWbsArray[i].Equals(otherWbsArray[i]))
{
continue;
}
else
{
result = Int32.Parse(instanceWbsArray[i]).CompareTo(Int32.Parse(otherWbsArray[i]));
break;
}
}
return result;
}
现在,在考虑第二个WBS之前,我希望能够按字母顺序排序考虑多个参数,如项目名称。我怎么能这样做?
答案 0 :(得分:9)
我不知道你班级的细节,所以我将提供一个使用字符串和LINQ列表的例子。 OrderBy
将按字母顺序排列字符串,ThenBy
将按照其长度对它们进行排序。您可以轻松地根据需要调整此样本。
var list = new List<string>
{
"Foo",
"Bar",
"Foobar"
};
var sortedList = list.OrderBy(i => i).
ThenBy(i => i.Length).
ToList();
答案 1 :(得分:3)
我们在像您这样的案件中通常会这样做:
public int CompareTo( SomeClass other )
{
int result = this.SomeProperty.CompareTo( other.SomeProperty );
if( result != 0 )
return result;
result = this.AnotherProperty.CompareTo( other.AnotherProperty );
if( result != 0 )
return result;
[...]
return result;
}
P.S。 发布代码时,请尝试仅包含与您的问题相关的代码。您发布的代码中有大量内容我不需要阅读,这实际上让我的眼睛受伤了。
答案 2 :(得分:2)
我喜欢Eve的答案,因为它具有灵活性,但我很惊讶没有人提到创建自定义IComparer<T>
实例
IComparer<T>
是一个通用接口,它定义了一种比较类型T
的两个实例的方法。使用IComparer<T>
的优点是您可以为常用的每个排序顺序创建实现,然后在必要时使用它们。这允许您在类型CompareTo()
方法中创建默认排序顺序,并单独定义替代订单。
E.g。
public class MyComparer
: IComparer<YourType>
{
public int Compare(YourType x, YourType y)
{
//Add your comparison logic here
}
}
IComparer<T>
对于组合特别有用,你可以使用比较器来比较给定类型的某些属性,使用另一个对属性类型进行操作的比较器。
如果您需要在不受控制的类型上定义排序,这也非常有用。它的另一个优点是它不需要LINQ,因此可以在旧代码(.Net 2.0以后)中使用
答案 3 :(得分:0)
首先按字母顺序比较项目名称,如果它们不等于返回值,如果不是基于第二个值执行比较
public int CompareTo(DisplayItemsEntity other)
{
if(other.ProjectName.CompareTo(this.ProjectName) != 0)
{
return other.ProjectName.CompareTo(this.ProjectName)
}
//else do the second comparison and return
return result;
}