C# 按子集合订购集合

C# 按子集合订购集合,c#,C#,我有以下对象 public class ObjectA{ public string Name { get; set; } public ICollection<ObjectB> ObjectBCollection { get; set; } } public class ObjectB{ public string Name { get; set; } public ICollection<ObjectC> ObjectCCollect

我有以下对象

public class ObjectA{
    public string Name { get; set; }
    public ICollection<ObjectB> ObjectBCollection { get; set; }
}

public class ObjectB{
    public string Name { get; set; }
    public ICollection<ObjectC> ObjectCCollection { get; set; }
}

public class ObjectC{
    public string Name { get; set; }
    public DateTime Date { get; set; }
    public InternalType Type { get; set; }
}

public enum InternalType {
     TypeA,
     TypeB,
     TypeC
}
公共类ObjectA{
公共字符串名称{get;set;}
公共ICollection对象集合{get;set;}
}
公共类对象B{
公共字符串名称{get;set;}
公共ICollection对象集合{get;set;}
}
公共类对象{
公共字符串名称{get;set;}
公共日期时间日期{get;set;}
公共内部类型类型{get;set;}
}
公共枚举内部类型{
TypeA,
B型,
C型
}
现在,我想按
ObjectC
中的
Dates
排序与当前日期最接近的
ObjectA
列表。为了让事情更有趣一点,我还希望它按
InteralType
排序。但我希望
TypeB
优先于
TypeA
TypeC
排在最后


我正在考虑创建一个额外的值,表示当前日期和
日期
属性之间的时间跨度的整数值,并将其乘以
类型
属性,但我不知道如何实际执行该操作。

首先,如果要在枚举中进行特定排序,可以执行以下操作:

public enum InternalType : int
{
     TypeA = 2,
     TypeB = 1,
     TypeC = 3
}
接下来,如果我正确理解了您的问题,您有:

var collection = new List<ObjectA>();
我相信这应该行得通。但是我没有测试它。 如果我误解了要求,请在评论中纠正我


最后要添加的内容-据我所知,Linq表达式并不是对集合进行排序的最快方法。

如果包含未排序的示例项的非正式列表以及假定的排序结果,这会有所帮助。ObjA是否有一对多映射到ObjC?您如何决定从哪个日期和内部类型中选择对obj A进行排序?有什么例子吗?谢谢!这是一个很大的帮助。第一个SelectMany是不需要的,并且导致了错误。如果
collection
IEnumerable
则需要第一个SelectMany()。如果
collection
ObjectA
则不是。
List<KeyvaluePair<DateTime, ObjectA>> collectionWithDates = collection
    .Select
    (
        objectA => new KeyValuePair<DateTime, ObjectA>
        (
            objectA
                .SelectMany(a => a.ObjectBCollection)
                .SelectMany(b => b.ObjectCCollection)
                .OrderBy(c => c.Date).ThenBy(c => (int)c.Type)
                .Last()
                .Date,
            objectA
        )
    )
    .ToList();
var orderedCollection = collectionWithDates
    .OrderBy(d => d.Key)
    .Select(d => d.value)
    .ToList();