是否可以定义在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标准中使用。

这可能吗?

谢谢你的帮助。

是否可以定义在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();
}