【问题标题】:Order list by List<int> property按 List<int> 属性排序列表
【发布时间】:2014-05-25 05:50:17
【问题描述】:

我需要按点排序我的列表,然后按位置。如何通过 Positions List 属性对我的列表进行排序?

public class Sailor
{
    public string Name { get; set; }
    public int Points { get; set; }
    public List<int> Positions { get; set; }

    public Sailor(string name, int points, List<int> positions)
    {
        Name = name;
        Points = points;
        Positions = positions;
    }
}

var sailors = new List<Sailor>
                    {
                        new Sailor("Carl", 20, new List<int> { 2, 2, 4, 1, 1 }),
                        new Sailor("Paul", 10, new List<int> { 4, 5, 3, 2, 5 }),
                        new Sailor("Anna", 20, new List<int> { 1, 1, 1, 3, 4 }),
                        new Sailor("Lisa", 11, new List<int> { 3, 4, 5, 5, 2 }),
                        new Sailor("Otto", 11, new List<int> { 5, 3, 2, 4, 3 })
                    };

foreach (var sailor in sailors)
{
    sailor.Positions.Sort();
}

var orderedListOfSailors = sailors.OrderByDescending(x => x.Points);

这给了我:

Carl, Anna, Lisa, Otto, Paul

我想要的:

Anna, Carl, Otto, Lisa, Paul

为什么?因为 Anna 有 3 个第一名,Carl 有 2 个。Otto 有 2、3、3,Lisa 有 2、3、4。

【问题讨论】:

    标签: linq list int


    【解决方案1】:

    Points排序后,再按名额排序。

    var orderedListOfSailors = sailors
                            .OrderByDescending(x => x.Points)
                            .ThenByDescending(x => x.Positions.Count(y => y == 1))
                            .ThenByDescending(x => x.Positions.Count(y => y == 2))
                            .ThenByDescending(x => x.Positions.Count(y => y == 3))
                            .ThenByDescending(x => x.Positions.Count(y => y == 4));
    

    【讨论】:

      【解决方案2】:

      问题可以通过对Sailor 的实例使用字典排序来解决;您可以为Sailor 实现自定义比较器,或者使用ThenBy 扩展方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多