Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于日期时间的有序集合_C#_.net_Datetime_Collections - Fatal编程技术网

C# 基于日期时间的有序集合

C# 基于日期时间的有序集合,c#,.net,datetime,collections,C#,.net,Datetime,Collections,我正在寻找一种实现集合的方法,该集合保证基于DateTime值的订单。我最初的想法是将SortedSet与自定义i比较程序一起使用,如下所示: internal class DateTimeComparer : IComparer<MyType> { public int Compare(MyType x, MyType y) { return x.DateTimeProp.CompareTo(y.DateTimeProp); } } var sor

我正在寻找一种实现集合的方法,该集合保证基于
DateTime
值的订单。我最初的想法是将
SortedSet
与自定义
i比较程序一起使用,如下所示:

internal class DateTimeComparer : IComparer<MyType> {
    public int Compare(MyType x, MyType y) {
        return x.DateTimeProp.CompareTo(y.DateTimeProp);
    }
}

var sortedSet = new SortedSet<MyType>(new DateTimeComparer());
内部类DateTimeComparer:IComparer{
公共整数比较(MyType x,MyType y){
返回x.DateTimeProp.CompareTo(y.DateTimeProp);
}
}
var sortedSet=new sortedSet(new DateTimeComparer());
但是,这不起作用,因为集合似乎覆盖/替换了所有具有准确时间戳的项。为了验证这一假设,我创建了两个集合,一个是一个简单的列表,在填充its后使用
DateTime
属性对其进行排序,另一个是基于
SortedSet
->的集合,基于集合的集合缺少多个条目,恰好是具有完全相同时间戳的条目


实现这样的集合还有哪些其他选项?

维护已排序的项目集合的有效方法是使用二叉搜索树。当然,您可以构建自己的二元搜索树,但是该类是使用红黑二元搜索树实现的,因此重用该类似乎更明智,而这正是您要做的

SortedSet
中项目的排序是通过调用方法比较项目对来控制的。如果此方法返回0,则认为这两个项相等,并且这些项中只有一个将存储在集合中。在使用
DateTimeComparer
的情况下,您会遇到一个问题,即集合中只能存储一个带有指定
DateTimeProp
MyType
实例

要解决此问题,必须确保在使用
DateTimeComparer.Compare
方法进行比较时,distinct
MyType
实例从不相等。您可以修改代码以实现此目的:

class DateTimeComparer : IComparer<MyType> {

    readonly ObjectIDGenerator idGenerator = new ObjectIDGenerator();

    public int Compare(MyType x, MyType y)  {
        if (x.DateTimeProp != y.DateTimeProp)
            return x.DateTimeProp.CompareTo(y.DateTimeProp);
        bool firstTime;
        var xId = idGenerator.GetId(x, out firstTime);
        var yId = idGenerator.GetId(y, out firstTime);
        return xId.CompareTo(yId);
    }
}
class DateTimeComparer:IComparer{
只读ObjectGenerator idGenerator=新ObjectGenerator();
公共整数比较(MyType x,MyType y){
如果(x.DateTimeProp!=y.DateTimeProp)
返回x.DateTimeProp.CompareTo(y.DateTimeProp);
布尔第一次;
var xId=idGenerator.GetId(x,首次输出);
var yId=idGenerator.GetId(y,首次输出);
返回xId.CompareTo(yId);
}
}
如果这两个实例具有不同的
DateTimeProp
值,则应根据这些值对它们进行排序。这由初始的
if
语句处理

如果这两个值具有相同的
DateTimeProp
值,则需要根据其他一些标准对它们进行排序。您可以使用
MyType
的其他属性,但在某些情况下,这些属性可能相等,并且重要的是,除非
x
y
引用相同的实例(例如
ReferenceEquals(x,y)
为true),否则该方法永远不会返回0

要处理此问题,您可以使用将唯一的64位ID值分配给不同实例的。然后可以对这些进行比较以提供订购


请注意,具有相同
DateTimeProp
值的项目的顺序将是随机的,但保持一致。要控制此排序,您可以使用
MyType的其他属性
,但最终,当两个不同实例的所有属性都相同时,您必须使用生成的ID来提供排序。

您为什么不只是想将所有内容添加到列表中,然后再对其进行排序?您是否尝试过
SortedList
?(请注意,排序列表比普通列表慢。因为每次使用索引访问项目时,它都会执行二进制搜索,而列表将直接为您提供该索引中的项目)集合只能包含一次特定值。使用<代码> DateTimeComparer < /代码>,如果两个值具有相同的时间戳,则两个值被认为是相同的,因此,只有当考虑到它们的其他属性时,两个值才会为特定的时间戳存储单个值。这正是我的问题所在。当两个时间戳相等时,我只需返回“大于”(1)即可解决此问题。