我有一组包含另一组的对象。
private class Pilot
{
public string Name;
public HashSet<string> Skills;
}
以下是一些测试数据:
public void TestSetComparison()
{
var pilots = new[]
{
new Pilot { Name = "Smith", Skills = new HashSet<string>(new[] { "B-52", "F-14" }) },
new Pilot { Name = "Higgins", Skills = new HashSet<string>(new[] { "Concorde", "F-14" }) },
new Pilot { Name = "Jones", Skills = new HashSet<string>(new[] { "F-14", "B-52" }) },
new Pilot { Name = "Wilson", Skills = new HashSet<string>(new[] { "F-14", "Concorde" }) },
new Pilot { Name = "Celko", Skills = new HashSet<string>(new[] { "Piper Cub" }) },
};
我想在Linq中使用OrderBy,以便实现以下功能:
- Smith和Jones一起排序,因为他们驾驶相同的飞机 - Higgins和Wilson一起排序,因为他们驾驶相同的飞机 - 不要紧 Higgins+Wilson排在Smith+Jones前面或后面 - 最好是Smith在Jones之前(稳定排序),但这不太重要
我认为我需要实现一个IComparer来传递给OrderBy,但不知道如何处理上述“doesn't matter”方面和稳定排序。
更新: 我希望输出是相同五个Pilot对象的数组,但顺序不同。
IComparer<Pilot>
,而是需要一个IEqualityComparer<HashSet<string>>
来检查两个Skills
集合是否相等。然后在GroupBy
调用中使用此比较器按Skills
分组。据我所知,GroupBy
会保留元素的顺序。 - René Vogt