首页 > 解决方案 > 按一个属性拆分列表并对升序嵌套列表进行排序按属性

问题描述

我有一个简单的课程:

class SimpleDevice 
{
    public string IMEI {get;set;}
    public long Timestamp {get;set;}
}

以及一种为测试目的生成列表的方法:

private static List<SimpleDevice> GenerateListOfDevices() 
{
    return new List<SimpleDevice>()
    {
        new SimpleDevice { IMEI = "bbbbb", Timestamp = 33 },
        new SimpleDevice { IMEI = "bbbbb", Timestamp = 45 },
        new SimpleDevice { IMEI = "aaaaa", Timestamp = 36 },
        new SimpleDevice { IMEI = "aaaaa", Timestamp = 37 },
        new SimpleDevice { IMEI = "aaaaa", Timestamp = 35 },
        new SimpleDevice { IMEI = "bbbbb", Timestamp = 34 },
        new SimpleDevice { IMEI = "aaaaa", Timestamp = 39 },
        new SimpleDevice { IMEI = "aaaaa", Timestamp = 38 },
        new SimpleDevice { IMEI = "bbbbb", Timestamp = 35 }
    };
}

我想将嵌套列表拆分List<SimpleDevice>List<List<SimpleDevice>>IMEI.

然后,我想按它们对内部列表进行排序Timestamp,因此每个列表都有一个顺序输出。

这是我的LINQ声明:

private static List<List<SimpleDevice>> SplitAndSort (List<SimpleDevice> devices)
{
    return devices
            .Select(x => x)
            .GroupBy(x => x.IMEI)
            .Select(x => x.Select(y => y).ToList())
            .OrderBy(x => x.Select(y => y.Timestamp))
            .ToList();
}

这引发了以下异常:

最里面的异常 System.ArgumentException :至少一个对象必须实现 IComparable

这是发生在OrderBy(x => x.Select(y => y.Timestamp)).

我有一个谷歌,发现该类型OrderedBy必须实现IComparable,该类型long执行以下操作:

public struct Int64 : IComparable, IComparable<Int64>, ...

将内部更改为x => x.Select(...myOrderByx => x.Min(...允许我编译和运行我的代码,但内部列表不是由它们排序的Timestamp,尽管拆分有效:

IMEI: bbbbb, Timestamp: 33
IMEI: bbbbb, Timestamp: 45
IMEI: bbbbb, Timestamp: 34
IMEI: bbbbb, Timestamp: 35
IMEI: aaaaa, Timestamp: 36
IMEI: aaaaa, Timestamp: 37
IMEI: aaaaa, Timestamp: 35
IMEI: aaaaa, Timestamp: 39
IMEI: aaaaa, Timestamp: 38

尝试按升序对内部列表进行排序时,是否有明显的遗漏?

标签: c#linq

解决方案


您的查询有点混乱。你把OrderBy它放在错误的地方 - 它适用于外部列表而不是内部。因此,例外。

在您选择(生成)嵌套列表时进行排序:

private static List<List<SimpleDevice>> SplitAndSort(List<SimpleDevice> devices)
{
    return devices
                .GroupBy(x => x.IMEI)
                .Select(g => g.Select(y => y).OrderBy(x => x.Timestamp).ToList())
                .ToList();
}

请注意,您取出.Select(y=>y)OrderBy就足够了。(我没有在上面删除)


推荐阅读