C# Select OrderBy似乎不适用于LINQ表达式

C# Select OrderBy似乎不适用于LINQ表达式,c#,linq,lambda,C#,Linq,Lambda,我定义了一个列表集合: public List<PacketToSend> Packets = new List<PacketToSend>(); 我在服务器的web scokect连接上的OnMessage事件上向此集合添加: Packets.Add(new PacketToSend { FrameLag = frameLag, RelayDiff = DateTime.Now, TS = timeStamp, JPEG = packe

我定义了一个列表集合:

public List<PacketToSend> Packets = new List<PacketToSend>();
我在服务器的web scokect连接上的OnMessage事件上向此集合添加:

Packets.Add(new PacketToSend
{
    FrameLag = frameLag,
    RelayDiff = DateTime.Now,
    TS = timeStamp,
    JPEG = packet2,
    LicenseKey = licenseKey.ToUpper(),
    NetworkLag = 0
});  
对于这个问题,唯一重要的值是TS字段

我经历过消息的顺序有时不正确,因此,我使用此代码获取“最年轻”的TS:

var min = Packets.OrderBy(m => m.TS).FirstOrDefault(); 
现在我已经体验到(尤其是当列表超过50时,“最年轻”的TS不会返回

我想试着用“Min”来代替:

var min2 = Packets.OrderBy(m => m.TS).Min();
但我当然会犯错误:

System.ArgumentException: At least one object must implement IComparable.
你知道为什么第一种方法不总是有效的吗?也许还有一个关于如何使用第二种方法的建议

注意

进一步资料


我等待,直到我得到一个TS的缓冲区5秒,然后尝试获取最早的1。我知道人们会建议使用锁,但我的FPS速度慢了,需要20 FPS。此外,我使用了并发集合,但我遇到了漏帧

你的第一种方法没有错,你怎么想它不工作?@DavidG我将结果写入控制台,查看它返回的值,以及列表中“左”的值列表,它肯定不会返回“最年轻的”TS:(你不能调用IEnumerable.Min()如果T未实现IComparable.OrderBy,则使用提供的lambda表达式对元素进行排序,但完成后,您的程序无法知道结果列表已排序,或者实际上无法知道如何找出“最小值”在
PacketToSend
objects@kai是的,你说得很对。我只是想看看/知道是否有其他方法:)获取列表的克隆,从该列表中获取最年轻的一个,然后将克隆的列表输出到控制台。您现在应该看到您最年轻的项确实是正确的。您的第一个方法没有问题,是什么让您认为它不起作用?@DavidG我将结果写入控制台,查看它返回的值以及va列表lues在列表中为'left',并且它肯定不会返回'mineet'TS:(如果t未实现IComparable,则不能调用IEnumerable.Min()。OrderBy使用提供的lambda表达式对元素进行排序,但在完成后,程序无法知道结果列表已排序,或者实际上无法知道如何找出结果“最少”在
PacketToSend
objects@kai是的,你说得很对。我只是想看看/知道是否有其他方法:)克隆列表,从列表中获取最年轻的一个,然后将克隆的列表输出到控制台。你现在应该看到最年轻的项确实是正确的。
System.ArgumentException: At least one object must implement IComparable.