Linq如何将同一集合中的两个数据作对比?

阿旭 2010-11-16 10:53:29
根据条件查询数据源,获取了一个GPS数据的集合,IEnumerator<GpsData>。

因为GPS设备有些数据是不正确的,需要对数据进行过滤。过滤的条件是速度大于某个值的话,则将该数据舍弃。

我的想法是先对该集合按时间排序,然后对连续两条数据进行比较,请问该怎么写?
...全文
1620 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
claymore1114 2010-11-16
  • 打赏
  • 举报
回复
你可以试试 Aggregate方法。你那个 经纬度距离 怎么算的??

var query = list.OrderBy(l => l.Time).Aggregate((one, two) => (one.Latitute - one.Longitude) / (two.Time - one.Time).Minutes < 20 ? one : null);
var query1 = list.OrderBy(l => l.Time).Aggregate((one, two) =>
{
Console.WriteLine((one.Latitute - one.Longitude) / (two.Time - one.Time).Minutes);
if ((one.Latitute - one.Longitude) / (two.Time - one.Time).Minutes < 20)
return one;
else
return null;
});
q107770540 2010-11-16
  • 打赏
  • 举报
回复
根据速度过滤用Where 即可
var query=from t in db.tb
where t.speed <=某个值
orderby t.time descing
select t;

排序用order by
阿旭 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 breezekey 的回复:]

IEnumerator<GpsData> listA = new IEnumerator<GpsData>();
var listB = listA.where(p=>p.速度<某个值)
listB应该是你要的集合
差不多是这样吧
要结合Lambda 表达式使用才好使
[/Quote]


public class GpsData
{
public double Latitute;//纬度

public double Longitude;//经度

public DateTime Time;//时间
}


不好意思,没说清楚。上面是类GpsData的结构,并没有直接记录车辆当时的行驶速度。

我是想通过比较两条数度,由 经纬度距离/时间差 得出速度,从而去判断速度是否大于某个指定值。
阿旭 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 claymore1114 的回复:]

引用楼主 z119977662 的回复:
根据条件查询数据源,获取了一个GPS数据的集合,IEnumerator<GpsData>。

因为GPS设备有些数据是不正确的,需要对数据进行过滤。过滤的条件是速度大于某个值的话,则将该数据舍弃。

我的想法是先对该集合按时间排序,然后对连续两条数据进行比较,请问该怎么写?

连续两条数据进行比较,比较什么,条件呢?
[/Quote]


public class GpsData
{
public double Latitute;//纬度

public double Longitude;//经度

public DateTime Time;//时间
}


不好意思,没说清楚。上面是类GpsData的结构,并没有直接记录车辆当时的行驶速度。

我是想通过比较两条数度,由 经纬度距离/时间差 得出速度,从而去判断速度是否大于某个指定值。
阿旭 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jiangshun 的回复:]

需求不明确或者看不懂,给测试数据和结果,及必要说明
[/Quote]


public class GpsData
{
public double Latitute;//纬度

public double Longitude;//经度

public DateTime Time;//时间
}


不好意思,没说清楚。上面是类GpsData的结构,并没有直接记录车辆当时的行驶速度。

我是想通过比较两条数度,由 经纬度距离/时间差 得出速度,从而去判断速度是否大于某个指定值。
jiangshun 2010-11-16
  • 打赏
  • 举报
回复
需求不明确或者看不懂,给测试数据和结果,及必要说明
claymore1114 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 z119977662 的回复:]
根据条件查询数据源,获取了一个GPS数据的集合,IEnumerator<GpsData>。

因为GPS设备有些数据是不正确的,需要对数据进行过滤。过滤的条件是速度大于某个值的话,则将该数据舍弃。

我的想法是先对该集合按时间排序,然后对连续两条数据进行比较,请问该怎么写?
[/Quote]
连续两条数据进行比较,比较什么,条件呢?
breezekey 2010-11-16
  • 打赏
  • 举报
回复
IEnumerator<GpsData> listA = new IEnumerator<GpsData>();
var listB = listA.where(p=>p.速度<某个值)
listB应该是你要的集合
差不多是这样吧
要结合Lambda 表达式使用才好使
flyerwing 2010-11-16
  • 打赏
  • 举报
回复
好象没什么好的办法吧.
不知道,帮顶!
阿旭 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 z119977662 的回复:]

如果它与前一个数的值大10的话

[/Quote]

打错字,应为“如果它与前一个数的差大于10的话”。
阿旭 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 claymore1114 的回复:]

你可以试试 Aggregate方法。你那个 经纬度距离 怎么算的??
C# code

var query = list.OrderBy(l => l.Time).Aggregate((one, two) => (one.Latitute - one.Longitude) / (two.Time - one.Time).Minutes < 20 ? one : null);
var qu……
[/Quote]

其实不用在意那个速度怎么计算。或者我这么问:

有一个数组{1, 11, 3, 20, 5,10,15, 20, 25, 30……},从第二个开始,如果它与前一个数的值大10的话,则把它去掉。那么得出的结果应该应该是{1, 11, 3, 5, 10,15, 20, 25, 30……},20被去掉了。

Aggregate好像有了一些什么,又好像缺了点什么。照我的要求,应该是过滤掉有问题的数据,那么最后返回的明显还是一个集合,而不是TSourse的一个对象。

其实可以通过Aggregate来遍历,然后将符合条件的数据加到另外一个集合中去,不过如果这样做的话,就跟一般for(int i = 0; i < Count; i++) { //list[i],list[i + 1]... }没区别了。我只是想问问linq有没这方面的函数。
阿旭 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 q107770540 的回复:]

根据速度过滤用Where 即可
var query=from t in db.tb
where t.speed <=某个值
orderby t.time descing
select t;

排序用order by
[/Quote]

不是这个意思,速度是要通过比较两条数据获取出来的。

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧