C#首先按类类型排序,然后使用CompareTo

时间:2016-07-29 18:30:22

标签: c# linq

我有一个名为Time的抽象类,然后是两个子类SingleYearPeriod。我以后可以有更多的子类。

Time类实现IComparable,但CompareTo函数实际上是在每个子类中实现的。

我在linq中有一个查询,如下所示:myListOfObjects.OrderBy(o=>o.Time);

这很有效。 但是,我希望能够选择SingleYearPeriod对象是否应该首先出现(在实际CompareTo之前)。我对CompareTo的实现是正确的,但在某些情况下,我需要先显示Periods,然后显示Single Years(反之亦然)。

由于我可以拥有更多(比如说5-6)子类,我如何能够指定哪些子类应该首先出现,然后CompareTo会在之后的工作中做什么?

3 个答案:

答案 0 :(得分:4)

import pandas as pd

df = pd.read_csv('input.txt', names=['url', 'timestamp'],
                 header=None, delim_whitespace=True)

output = df.groupby('url')['timestamp'].agg({'count': 'size', 'time': 'min'})
output.to_csv('output.csv')

答案 1 :(得分:0)

我认为这样做会:

list.OrderBy(t => typeof(t).Name).ThenBy(o => o.Time)

答案 2 :(得分:0)

在大多数情况下,拥有类和子类的意义在于我们可以将它们转换为基类(或接口),而不再需要区分特定类型。

如果你以一种了解类型的方式对它们进行排序,并且你有五种或六种类型,那么你最终将最终得到这个:

.OrderBy(o => o is SingleYear)
    .ThenBy(o => o is Period)
    .ThenBy(o => o is SomeOtherClass)
    .ThenBy(o => o is Another)
    .ThenBy(o => o is Whatever)
    .ThenBy(o => o is Etc)
    .ThenBy(o => o.Time);

这不是世界末日,但我不会喜欢它。如果我们不区分代码中的类(检查它们是什么类型),那就更好了。相反,类通过不同的方式实现属性和方法来区分自己

排序顺序是否取决于期间的长度?您可以让您的类实现一个指示句点长度的属性 - 可能是SingleYear的常量,但是为Period计算。

然后,您可以在每个类上实现IComparable,或者提供单独的IComparer<T>实现,例如

public class TimeComparer : IComparer<Time>
{
    public int Compare(Time t1, Time t2)
    {
        var periodComparison = t1.Duration.CompareTo(t2.Duration);
        return periodComparison != 0 ? periodComparison : t1.Time.CompareTo(t2.Time);
    }
}