C# 从另一个分组列表创建列表。(按日期计算的费率)
我得到了一个集合的列表,它有许多属性。具体来说,其中3个是:ID1、ID2(两个ID都是我的表中的键,在这种情况下ID1将始终相同)、数量和日期 一些事实:C# 从另一个分组列表创建列表。(按日期计算的费率),c#,.net,C#,.net,我得到了一个集合的列表,它有许多属性。具体来说,其中3个是:ID1、ID2(两个ID都是我的表中的键,在这种情况下ID1将始终相同)、数量和日期 一些事实: 我将通过选择所有ID1号码获得一个列表 我需要用ID1和ID2检查我有多少ID2重复记录(可能返回2条以上的记录) 如果我有多条记录具有相同的ID1和ID2,我将需要从这些重复记录中检查其中一条(如果有)具有相同的数量。在这个记录中,我需要得到重复次数最多的最新(使用日期变量)记录 让我尝试一下: 样本1: 记录1:ID1=1,ID2
- 我将通过选择所有ID1号码获得一个列表
- 我需要用ID1和ID2检查我有多少ID2重复记录(可能返回2条以上的记录)
- 如果我有多条记录具有相同的ID1和ID2,我将需要从这些重复记录中检查其中一条(如果有)具有相同的数量。在这个记录中,我需要得到重复次数最多的最新(使用日期变量)记录
- 记录1:ID1=1,ID2=2,数量=100,日期=11/09/2011
- 记录2:ID1=1,ID2=2,数量=100,日期=2011年11月10日
- 记录3:ID1=1,ID2=2,数量=10,日期=2011年11月10日
- 记录4:ID1=1,ID2=2,数量=13,日期=11/10/2011
- 记录1:ID1=1,ID2=2,数量=100,日期=11/01/2011
- 记录2:ID1=1,ID2=2,数量=100,日期=11/02/2011
- 记录3:ID1=1,ID2=2,数量=120,日期=11/05/2011
- 记录4:ID1=1,ID2=2,数量=120,日期=2011年7月11日
- 记录1:ID1=1,ID2=2,数量=120,日期=11/01/2011
- 记录2:ID1=1,ID2=2,数量=120,日期=11/02/2011
- 记录3:ID1=1,ID2=2,数量=120,日期=11/05/2011
- 记录4:ID1=1,ID2=2,数量=100,日期=2011年7月11日
- 记录5:ID1=1,ID2=2,数量=100,日期=11/08/2011
- 记录1:ID1=1,ID2=2,数量=120,日期=11/01/2011
- 记录2:ID1=1,ID2=3,数量=120,日期=11/02/2011
- 记录3:ID1=1,ID2=4,数量=120,日期=11/05/2011
- 记录4:ID1=1,ID2=5,数量=100,日期=2011年7月11日
- 记录5:ID1=1,ID2=5,数量=100,日期=11/08/2011
public class MyEntity
{
pulic int? ID1 {get; set;}
pulic int? ID2 {get; set;}
pulic int? Quantity {get; set;}
public DateTime? Date {get; set;}
}
我的控制器有一种方法,将此实体用作列表,并从数据库接收buch os registers:
List<MyEntity> list = new List<MyEntity>();
//The Method "getObjects" recieves the parameters ID1, ID2. Since the 2nd parameter is null.
//It will return a list with all the ID2 registers since they have the same ID1 as the one I used.
list.AddRange(getObjects(ID1,null);
List List=新列表();
//方法“getObjects”接收参数ID1、ID2。因为第二个参数为空。
//它将返回一个包含所有ID2寄存器的列表,因为它们的ID1与我使用的相同。
AddRange(getObjects(ID1,null);
我完全不知道如何继续我的要求。我不知道是否最好先把只有一条记录的记录分开,然后过滤其他记录,或者一起做所有事情
有一些用户将要检查卡车内的一些设备。进入每个卡车的每个人都会生成一个id(ID1)和日期。此id指的是该特定用户正在进行的孔会议。每个设备(ID2,另一个表)都有一个专用id和其特定数量(数量)因为这取决于人,我需要考虑这次会议可能有任何错误。这就是为什么我需要考虑重复的数量。如果我在最后120个数量重复了四次之后有100次的两次,我会考虑ID1和ID2的最后一个登记,得到120个数量< /P> < P>我会打破它。n分为两个简单的步骤
// for each combination of ID1 and ID2
// return the latest item from the
// most frequently-occuring quantity
IEnumerable<MyEntity> GetLatestMaxByID(IEnumerable<MyEntity> list) {
foreach (var group in list.GroupBy(x => new { x.ID1, x.ID2 }))
yield return GetSingleItemForIDs(group);
}
// return the latest item from the
// most frequently-occuring quantity
MyEntity GetSingleItemForIDs(IEnumerable<MyEntity> list) {
return list.GroupBy(x => x.Quantity)
.MaxBy(g => g.Count())
.MaxBy(x => x.Date);
}
// use MaxBy from the morelinq (http://code.google.com/p/morelinq)
// or use a simplified one here
// Get the maximum item based on a key
public static T MaxBy<T, U>(this IEnumerable<T> seq, Func<T, U> f) {
return seq.Aggregate((a, b) => Comparer<U>.Default.Compare(f(a), f(b)) < 0 ? b : a);
}
//对于ID1和ID2的每个组合
//从中返回最新的项目
//最常发生量
IEnumerable GetLatestMaxByID(IEnumerable列表){
foreach(list.GroupBy(x=>new{x.ID1,x.ID2})中的var组)
收益返回GetSingleItemForIDs(组);
}
//从中返回最新的项目
//最常发生量
MyEntity GetSingleItemForId(IEnumerable列表){
返回列表.GroupBy(x=>x.Quantity)
.MaxBy(g=>g.Count())
.MaxBy(x=>x.Date);
}
//使用morelinq中的MaxBy(http://code.google.com/p/morelinq)
//或者在这里使用一个简化的
//根据密钥获取最大项
公共静态T MaxBy(此IEnumerable seq,函数f){
返回序列聚合((a,b)=>Comparer.Default.Compare(f(a),f(b))<0?b:a);
}
请发布您编写的代码。我认为您需要更清楚地了解您正在做的事情。这看起来像是一个精选的N+1问题,但我可能错了,因为我不知道“我是否会获得重复的最新记录。”表示选择查询、for循环、Linq查询或其他完全不同的查询。您可以添加源代码吗?如果没有源代码,我们将在黑暗中拍摄,以了解如何帮助您的代码更高效。@ConradFrix我有一个日期(日期时间类型不可能重复)变量,我可以得到最新的一个,因为我有所有重复的(元素有相同的ID1,ID2和数量)记录。我只是添加了一些信息,你能帮我吗?我还在努力开发