C# 比较两个连续的行-按分组
我有一个模型如下C# 比较两个连续的行-按分组,c#,.net,linq,entity-framework,C#,.net,Linq,Entity Framework,我有一个模型如下 ID Date BoitierNumber 1 07/04/2012 14:01:46 1 2 07/04/2012 14:01:50 2 3 07/04/2012 14:01:50 3 4 07/04/2012 14:01:56 1 5 07/04/2012 14:02:06 1 6 07/04/2012 14:02:10
ID Date BoitierNumber
1 07/04/2012 14:01:46 1
2 07/04/2012 14:01:50 2
3 07/04/2012 14:01:50 3
4 07/04/2012 14:01:56 1
5 07/04/2012 14:02:06 1
6 07/04/2012 14:02:10 2
我已按(BoitierNumber)对行进行分组
为此,我使用了以下代码
var groups = context.Essais.GroupBy(p => p.BoitierNumber)
.Select(g => new { GroupName = g.Key, Members = g });
foreach (var g in groups)
{
Console.WriteLine("Members of {0}", g.GroupName);
foreach (var member in g.Members.OrderBy(x=>x.Id))
{
Console.WriteLine("{0} {1}", member.Id,member.Date);
}
}
目前一切正常
现在我想比较两个成功分组行的日期
如果第[i].date行>第[i-1].date行,我将删除第[i-1]行
例如:
*boitier Number 1
1 07/04/2012 14:01:46
4 07/04/2012 14:01:56
5 07/04/2012 14:02:06
8 07/04/2012 14:01:00
10 07/04/2012 14:00:00
13 07/04/2012 14:03:00
boitier Number 1
---> Date of row of Id 4 > Date of row of ID 1
then i will delete row of ID 1
---> Date of row of Id 5 > Date of row of ID 4
then i will delete row of ID 4
---> Date of row of Id 8 < Date of row of ID 5
then i will skip it
---> Date of row of Id 10 < Date of row of ID 8
then i will skip it
---> Date of row of Id 13 > Date of row of ID 10
then i will delete row of ID 10
...
TherFore, After this process, only rows 13 and 8 will be remain
*锅炉编号1
1 07/04/2012 14:01:46
4 07/04/2012 14:01:56
5 07/04/2012 14:02:06
8 07/04/2012 14:01:00
10 07/04/2012 14:00:00
13 07/04/2012 14:03:00
一号锅炉
--->Id为4的行的日期>Id为1的行的日期
然后我将删除ID为1的行
--->Id为5的行的日期>Id为4的行的日期
然后我将删除ID为4的行
--->Id 8行的日期Id 10行的日期Id为13的行的日期>Id为10的行的日期
然后我将删除ID为10的行
...
因此,在此过程之后,只保留第13行和第8行
您现在可以做的最快更改是:
var groups = context.Essais.GroupBy(p => p.BoitierNumber)
.Select(g => new
{
GroupName = g.Key,
Members = g.OrderBy(m=>m.Id)
});
编辑
EF似乎无法在投影中调用ToList()
成员现在将是一个按id排序的列表,然后您可以使用for代替foreach
foreach (var g in groups)
{
var members = g.Members.ToList();
for (int i = 1, i < members.Count; i++)
{
var previousMember = members[i-1];
var currentMember = members[i];
if (..)
// code to delete
}
}
当你说delete时,你的意思是从数据库中删除吗?是的,我想从数据库中删除行。为什么不使用for而不是foreach并检查上一项(i-1)?@AdrianIftode这就是我想要的,但是当我使用for循环
for(var i=0;ix.Id).count();i++)时,我不知道如何访问成员[i].id成员[i].date…@ElloumiAhmed在订购物品后添加一个.ToList()
调用var members=g.members.OrderBy(x=>x.Id.ToList()
然后您可以调用成员[i]
和成员[i-1]
。在for
中,您的意思是使用变量组吗?还有,为什么要从1开始循环而不是从零开始?@SteveMallory,这个for将在第一个迭代器中使用。我从1开始,所以会有一个以前的。我将编辑我的答案,可能不清楚。@AdrianIftode我得到这个错误LINQ to Entities不识别方法'«System.Collections.Generic.List'1[Model.Essai]ToList[Essai](System.Collections.Generic.IEnumerable'1[Model.Essai])
在foreach行中(组中的var g)@ElloumiAhmed,我不知道为什么(你添加了using System.Linq吗?@ElloumiAhmed,我编辑了它,查看我的新更改,告诉我它是否有效
foreach (var g in groups)
{
var members = g.Members.ToList();
for (int i = 1, i < members.Count; i++)
{
var previousMember = members[i-1];
var currentMember = members[i];
if (..)
// code to delete
}
}
var groups = context.Essais
.AsEnumberable().
.GroupBy(p => p.BoitierNumber)
.Select(g => new { GroupName = g.Key, Members = g.OrderBy(m=>m.Id).ToList() });