Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按一个属性拆分列表并按升序嵌套列表排序<;T>;按性质_C#_Linq - Fatal编程技术网

C# 按一个属性拆分列表并按升序嵌套列表排序<;T>;按性质

C# 按一个属性拆分列表并按升序嵌套列表排序<;T>;按性质,c#,linq,C#,Linq,我有一个简单的课程: class SimpleDevice { public string IMEI {get;set;} public long Timestamp {get;set;} } 以及用于生成用于测试目的的列表的方法: private static List<SimpleDevice> GenerateListOfDevices() { return new List<SimpleDevice>() {

我有一个简单的课程:

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 }
    };
}
正在引发以下异常:

最内层异常System.ArgumentException:至少一个对象必须实现IComparable

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

我在Google上找到了一个名为“OrderedBy的类型,该类型必须实现
IComparable
,类型
long
可以:

public struct Int64:IComparable,IComparable,…

将我的
OrderBy
中的内部
x=>x.Select(…
更改为
x=>x.Min(…
允许我编译和运行我的代码,但是内部列表并不是按照它们的
时间戳排序的,尽管拆分工作正常:

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

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

您可以选择“第二次选择”生成列表列表。order by还选择一个列表作为比较值,该值不实现
I可比较性
。如果您添加.FirstOrDefault
()
或类似值,则可以工作

devices
   .GroupBy(x => x.IMEI)
   .Select(x => x.OrderBy(y => y.Timestamp).ToList()) // <- order inner list here
   //.OrderBy(x => x.Select(y => y.Timestamp)) // you don't need this line then
   .ToList();
设备
.GroupBy(x=>x.IMEI)
.Select(x=>x.OrderBy(y=>y.Timestamp).ToList()//x.Select(y=>y.Timestamp))//那么您就不需要这一行了
.ToList();

您的查询有点混乱。 您将
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();
}
私有静态列表拆分和排序(列表设备)
{
返回装置
.GroupBy(x=>x.IMEI)
.Select(g=>g.Select(y=>y).OrderBy(x=>x.Timestamp.ToList())
.ToList();
}

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

以下内容应该可以满足您的要求:

private static List<List<SimpleDevice>> SplitAndSort (List<SimpleDevice> devices)
{
    return devices
            .GroupBy(x => x.IMEI)
            .Select(x => x.OrderBy(y=> y.TimeStamp).ToList())
            .ToList();
}
1.按IMEI对列表进行分组。您现在有了一个类型为IEnumerable的对象,您只需要ToList使类型匹配即可

.Select(x => x.OrderBy(y=> y.TimeStamp).ToList())
  • 在每个组中,按时间戳排序,然后调用ToList()给出内部列表

    .ToList()

  • 最后,最后一个列表将为您提供返回列表的类型


  • 好吧,让我试着走路,你扔这个

    首先,您要确保列表是按时间戳排序的,这样您现在就知道列表顺序是正确的,然后您要按分组进行排序,然后选择(x=>x.Select(y=>y).ToList()
    ,这将为您提供
    list


    不幸的是,它没有对时间戳排序,它的输出与OP中的示例相同。
    .GroupBy(x => x.IMEI)
    
    .Select(x => x.OrderBy(y=> y.TimeStamp).ToList())
    
        List<List<SimpleDevice>> test =  devices
            .OrderBy(x=> x.Timestamp)
            .GroupBy(x => x.IMEI)
            .Select(x => x.Select(y => y).ToList())
            .ToList();
    
    bbbbb 33
    bbbbb 34
    bbbbb 35
    bbbbb 45
    aaaaa 35
    aaaaa 36
    aaaaa 37
    aaaaa 38
    aaaaa 39