【发布时间】:2021-07-29 21:57:16
【问题描述】:
尝试对这些列表进行排序:
public class BusinessEvents : IComparable<BusinessEvent>
{
public long VersionId {get;set;}
public EventType EventType {get;set;}
}
排序逻辑如下:
public int CompareTo(BusinessEvent businessEvent)
{
if (VersionId > businessEvent.VersionId)
{
return 1;
}
if (VersionId < businessEvent.VersionId)
{
return -1;
}
if (EventType == EventType.TypeC ||
EventType == EventType.TypeD ||
EventType == EventType.TypeE)
{
if (businessEvent.EventType == EventType.TypeA ||
businessEvent.EventType == EventType.TypeB)
{
return 1;
}
}
return 0;
}
但是,这个单元测试失败了:
[Test]
public void BusinessEvent_Sort_Correctly_Break_Ties_Multiple()
{
// arrange
var event1 = GetEventWithTypeAndVersionId(1, EventType.TypeA);
var event2 = GetEventWithTypeAndVersionId(1, EventType.TypeD);
var event3 = GetEventWithTypeAndVersionId(1, EventType.TypeC);
var event4 = GetEventWithTypeAndVersionId(2, EventType.TypeB);
var event5 = GetEventWithTypeAndVersionId(2, EventType.TypeE);
var event6 = GetEventWithTypeAndVersionId(2, EventType.TypeC);
var events = new List<BusinessEvent> {event4, event2, event5, event6, event3, event1};
// act
events = events.OrderBy(c => c).ToList();
// assert
Assert.AreEqual(EventType.TypeA, events[0].EventType);
Assert.AreEqual(EventType.TypeD, events[1].EventType);
Assert.AreEqual(EventType.TypeC, events[2].EventType);
Assert.AreEqual(EventType.TypeB, events[3].EventType);
Assert.AreEqual(EventType.TypeE, events[4].EventType);
Assert.AreEqual(EventType.TypeC, events[5].EventType);
}
第一次断言失败。它将EventType.TypeD 和VersionId 放在排序列表的第一位,即使当VersionId 匹配时我指定EventType.TypeD 在EventType.TypeA 之后。
显然我误解了这个 API 提供的一些东西。我怎样才能得到我的预期结果?
【问题讨论】:
-
events.OrderBy(c => c).ToList()不改变订单? -
不确定你的意思。顺序正在改变,根据我对 API 的理解,它似乎不是正确的顺序。