是否可以定义在OrderBy标准中如何使用类型
本文关键字:何使用 类型 标准 OrderBy 定义 是否 | 更新日期: 2023-09-27 18:02:14
我有以下类型:
public class Type1
{
public Int32 ID { get; set; }
public Decimal Value { get; get; }
}
public class Type2
{
public Int32 ID { get; set; }
public Type1 Type1 { get; set; }
}
我还有以下功能:
List<Type2> GetOrderedType2List()
{
...
return type2List.OrderBy(type2 => type2.Type1).ToList();
}
我希望Type2
列表的实例根据它们的Type1
属性根据Type1.Value
值排序。但是,我想在Type1
中编写代码,指定Type1
如何在OrderBy
标准中使用。
这可能吗?
谢谢你的帮助。
您需要实现IComparable,如下所示:
public class Type1 : IComparable
{
public Int32 ID { get; set; }
public Decimal Value { get; set; }
public int CompareTo(object obj) {
var castObj = obj as Type1;
if (castObj == null)
return -1;
return Value.CompareTo(castObj.Value);
}
}
测试:
var list = new List<Type2> {
new Type2 { Type1 = new Type1 { Value = 50 } },
new Type2 { Type1 = new Type1 { Value = 2 } },
new Type2 { Type1 = new Type1 { Value = 100 } },
new Type2 { Type1 = new Type1 { Value = -10 } }
};
list.OrderBy(type2 => type2.Type1);
给出结果:
- 10,2,50,100
或者,您可以选择只与其他Type1对象进行比较(可能是最好的方法),并且可以这样做:
public class Type1 : IComparable<Type1>
{
public Int32 ID { get; set; }
public Decimal Value { get; set; }
public int CompareTo(Type1 obj) {
if (obj == null)
return -1;
return Value.CompareTo(obj.Value);
}
}
怎么样:
List<Type2> GetOrderedType2List()
{
...
return type2List.OrderBy(type2 => type2.Type1.Value).ToList();
}
您可以根据order by中定义的函数返回的值进行排序。我添加了一些随机逻辑,但您可以实现任何您想要的:
List<Type2> GetOrderedType2List()
{
...
return type2List.OrderBy(type2 =>
{
decimal orderValue;
if (type2.Type1 == null)
orderValue = 0;
else if (type2.Type1.Value < 0)
orderValue = Math.Abs(type2.Type1.Value);
else
orderValue = type2.Type1.Value;
return orderValue;
}).ToList();
}