我有以下对象
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
Dates
的{{1}}列表,其中ObjectC
位于当前日期的最近位置。为了让事情更有趣,我还希望它按InteralType
排序。但我希望TypeB
优先于TypeA
而TypeC
优先于最后。
我正在考虑创建一个额外的值,它显示当前日期和Date
属性之间的时间跨度的整数值,并乘以Type
属性,但我无法弄清楚如何实际做到这一点。
答案 0 :(得分:0)
首先,如果您想在Enum中进行特定订购,您可以这样做:
public enum InternalType : int
{
TypeA = 2,
TypeB = 1,
TypeC = 3
}
接下来,如果我理解你的问题,你有:
var collection = new List<ObjectA>();
您需要按子元素中的所有日期排序。你可以使用Linq表达式:
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();
要获得ObjectA的有序列表,您只需:
var orderedCollection = collectionWithDates
.OrderBy(d => d.Key)
.Select(d => d.value)
.ToList();
我相信这应该有效。但是我没有测试过它。 如果我误解了要求,请在评论中纠正我。
最后要添加的内容 - 据我所知,Linq表达式不是排序集合的最快方式。