儿童收集订单收集

时间:2013-10-30 08:40:37

标签: 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> 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优先于TypeATypeC优先于最后。

我正在考虑创建一个额外的值,它显示当前日期和Date属性之间的时间跨度的整数值,并乘以Type属性,但我无法弄清楚如何实际做到这一点。

1 个答案:

答案 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表达式不是排序集合的最快方式。