从另一个分组列表创建一个列表.(按日期收费)

本文关键字:列表 一个 日期 另一个 创建 | 更新日期: 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);
}