1

我有以下对象

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的列表DatesObjectC为了让事情变得更有趣,我还希望它按InteralType. 但我想TypeB优先并排在TypeA最后TypeC

我正在考虑创建一个额外的值,它表示当前日期和属性之间的时间跨度的整数值,并将其Date乘以Type属性,但我不知道如何实际做到这一点。

4

1 回答 1

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

于 2013-10-30T10:25:39.020 回答