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