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();