我有一个名为Time
的抽象类,然后是两个子类SingleYear
和Period
。我以后可以有更多的子类。
Time
类实现IComparable
,但CompareTo
函数实际上是在每个子类中实现的。
我在linq中有一个查询,如下所示:myListOfObjects.OrderBy(o=>o.Time);
这很有效。
但是,我希望能够选择SingleYear
或Period
对象是否应该首先出现(在实际CompareTo
之前)。我对CompareTo
的实现是正确的,但在某些情况下,我需要先显示Periods,然后显示Single Years(反之亦然)。
由于我可以拥有更多(比如说5-6)子类,我如何能够指定哪些子类应该首先出现,然后CompareTo会在之后的工作中做什么?
答案 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);
}
}