从另一个分组列表创建列表。 (按日期率)

时间:2011-11-09 20:45:02

标签: c# .net

我得到了一个包含许多属性的Collection列表。具体来说,其中3个是:ID1,ID2(IDS是我的表中的键,ID1在这种情况下总是相同的),数量和日期。

一些事实:

  • 我会通过选择所有ID1号码来获取列表。
  • 我需要检查ID2和ID2有多少ID2重复记录(可以返回2条以上的记录)。
  • 如果我有多个具有相同ID1和ID2的记录,我将需要检查那些具有相同数量的重复记录(如果有)。在这些记录中,我需要获得最新的(使用DATE变量)记录,重复多次。

让我尝试一下: 样本1:

  • 记录1:ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/09/2011
  • 记录2:ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/10/2011
  • 记录3:ID1 = 1,ID2 = 2,权重= 10,日期= 11/10/2011
  • 记录4:ID1 = 1,ID2 = 2,Quanity = 13,Date = 11/10/2011

我需要将元素(ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/10/2011)添加到结果列表中。重复2次,并且比日期为11/09/2011的记录更新

样本2:

  • 记录1:ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/01/2011
  • 记录2:ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/02/2011
  • 记录3:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/05/2011
  • 记录4:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/07/2011

我需要添加元素(记录4:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/07/2011)。即使数量为100和120的2条记录相同,最新的也是2011年7月11日。

样本3:

  • 记录1:ID1 = 1,ID2 = 2,权重= 120,日期= 11/01/2011
  • 记录2:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/02/2011
  • 记录3:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/05/2011
  • 记录4:ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/07/2011
  • 记录5:ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/08/2011

我需要添加元素(记录3:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/05/2011)。即使有了11月11日的记录,120个数量重复了3次,所以我得到了这个数量的最新记录。

样本4:

  • 记录1:ID1 = 1,ID2 = 2,权重= 120,日期= 11/01/2011
  • 记录2:ID1 = 1,ID2 = 3,Quanity = 120,Date = 11/02/2011
  • 记录3:ID1 = 1,ID2 = 4,Quanity = 120,Date = 11/05/2011
  • 记录4:ID1 = 1,ID2 = 5,Quanity = 100,Date = 11/07/2011
  • 记录5:ID1 = 1,ID2 = 5,Quanity = 100,Date = 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;} 
}

我的控制器有一个方法,它使用这个实体作为列表,并从数据库中收到一个buch 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指的是此特定用户正在进行的漏洞会议。每个设备(ID2,另一个表)都有一个特定数量(数量)的专用ID。由于它取决于人类,我需要考虑这次会议可能有任何错误。这就是为什么我需要考虑大部分时间重复的数量。如果我在重复四次的最后120个数量之后有两次100个数量,我会考虑ID1和ID2的最后一个有120个数量的寄存器

1 个答案:

答案 0 :(得分:2)

我将其分解为两个更简单的步骤。

// 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);
}