从另一个分组列表创建一个列表.(按日期收费)
本文关键字:列表 一个 日期 另一个 创建 | 更新日期: 2023-09-27 18:14:04
我得到了一个具有许多属性的集合列表。具体来说,其中3个是:ID1, ID2(两个IDS都是我表中的键,在这种情况下ID1总是相同的),Quantity和Date。
一些事实:- 我将通过选择所有ID1号码得到一个列表。
- 我需要检查我有多少ID2重复记录(可以返回超过2条记录)ID1和ID2。
- 如果我有超过1条相同ID1和ID2的记录,我需要从那些重复的记录中检查,其中一个有(如果他们有)相同的数量。在这些记录中,我需要获得重复次数最多的最新(使用DATE变量)记录。
让我试着举个例子:示例1:
- 记录1:ID1 = 1, ID2 = 2,数量= 100,日期= 11/09/2011
- 记录2:ID1 = 1, ID2 = 2,数量= 100,日期= 11/10/2011
- 记录3:ID1 = 1, ID2 = 2,数量= 10,日期= 11/10/2011
- 记录4:ID1 = 1, ID2 = 2,数量= 13,日期= 11/10/2011
我需要添加元素(ID1 = 1, ID2 = 2, quantity = 100, Date = 11/10/2011)到结果列表。重复2次且比日期为11/09/2011的记录更新
样本2:- 记录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,日期= 11/07/2011
我需要添加元素(记录4:ID1 = 1, ID2 = 2, quantity = 120, Date = 11/07/2011)。即使在数量100和120的相同范围内,最近的记录是2011年11月7日。
示例3:- 记录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,日期= 11/07/2011
- 记录5:ID1 = 1, ID2 = 2,数量= 100,日期= 11/08/2011
我需要添加元素(记录3:ID1 = 1, ID2 = 2, quantity = 120, Date = 11/05/2011)。即使使用11/08的记录,120数量重复了3次,所以我将使用该数量获得最新的记录。
示例4:- 记录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,日期= 11/07/2011
- 记录5:ID1 = 1, ID2 = 5,数量= 100,日期= 11/08/2011
我需要添加记录1,记录2,记录3和记录5(重复的第5条记录,我需要得到最新的记录);
我刚刚写了几行性能不佳的代码,所以我想问一下你们是否有更好的解决方案。
我将留下一个我试图开发的代码,让我们看看这对你们来说是否有意义。
我得到了以下实体:
public class MyEntity
{
pulic int? ID1 {get; set;}
pulic int? ID2 {get; set;}
pulic int? Quantity {get; set;}
public DateTime? Date {get; set;}
}
我的控制器有一个方法,使用这个实体作为一个列表,并从数据库接收一堆os寄存器:
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);
我完全不知道如何进行我的要求。我不知道是否最好首先只分离只有一条记录的记录,然后过滤其他记录或一起做所有事情。
有一些用户要检查卡车里的一些设备。每辆卡车上的每个人都会生成一个id (ID1)和日期。此ID指的是该特定用户正在进行的hole会议。每个设备(ID2,另一个表)获得一个具有特定数量(quantity)的独占ID。因为这取决于人,我需要考虑到这个会议可能会有任何错误。这就是为什么我需要考虑大多数时候重复的数量。如果在最后一个120的数量重复了四次之后,我有一个100的数量两次,我将考虑ID1和ID2的最后一个寄存器,它们获得了120的数量
我会把它分成两个简单的步骤。
// 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);
}