【问题标题】:Create a list from another grouped list. (Rate by date)从另一个分组列表创建一个列表。 (按日期评分)
【发布时间】:2011-11-09 20:45:01
【问题描述】:

我得到了一个包含许多属性的集合列表。特别是其中 3 个是:ID1、ID2(两个 IDS 都是我表中的键,在这种情况下 ID1 将始终相同)、数量和日期。

一些事实:

  • 我将通过选择所有 ID1 号码来获得一个列表。
  • 我需要检查 ID1 和 ID2 有多少个 ID2 重复记录(可能返回 2 条以上的记录)。
  • 如果我有超过 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,数量 = 120,日期 = 11/07/2011)。即使数量为 100 和 120 的 2 条记录的范围相同,最新的一条是从 2011 年 7 月 11 日开始的。

样本 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,数量 = 120,日期 = 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;} 
}

我的控制器有一个方法,使用这个实体作为一个列表,并从数据库中接收一个 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和它的具体数量(Quantity)。由于这取决于人,我需要考虑到这次会议可能有任何错误。这就是为什么我需要考虑大部分时间重复的数量。如果在最后一个重复四次的 120 个数量之后我有两次 100 个数量,我会考虑 ID1 和 ID2 中最后一个寄存器获得 120 个数量

【问题讨论】:

  • 请贴出你写的代码
  • 我认为您需要更清楚自己在做什么。它看起来像一个 SELECT N+1 问题,但我可能是错的,因为我不知道“我会得到重复记录的最新记录”。表示 SELECT 查询、for 循环或 Linq 查询,或完全不同的东西
  • 可以添加源代码吗?我们在没有它的情况下在黑暗中拍摄,看看我们如何帮助您的代码更有效率。
  • @ConradFrix 我有一个 Date(DateTime 类型,无法复制)变量,我可以获得最新的变量,因为我拥有所有重复的(具有相同 ID1、ID2 和数量的元素)记录
  • 伙计们,我刚刚添加了一些信息,您能帮帮我吗?我仍在尝试开发这个.. 谢谢!

标签: c# .net


【解决方案1】:

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

// 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 的实体。 (具有 ID1、ID2 和 Quantity 的 MyEntity)和具有(ID1、Date)的另一个实体。代码会发生很大变化吗?再次感谢!
  • @Dan-SP:我不确定如何从该格式中获取日期。例如,如果你有(ID1, ID2, Quantity) = [(1,20, 5), (1, 21, 10)],你有(ID1, Date) = [(1, '1/1/2011')],你怎么知道1/1/2011适用于哪条记录?
  • 这是一个命令!因此,OrderID 是 ID1,DATE = 订单日期,ID2 = 订单中每个产品的 ID。所以我可以认为 ID2 是在 ORDER X 和 DATE Y 中订购的。日期将应用于所有 ID2订单 ID1。
  • @Dan-SP:在这种情况下,它不会对代码进行太多更改,但实际上会更简单。在您的示例中,每个订单都有不同的日期,但如果您知道订单的日期始终相同,您甚至不需要在GetSingleItemForIDs 中检查它,只需要担心数量。跨度>
  • 我刚刚编辑了主要帖子,因为我的解释很长。检查那个。最后一段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-13
  • 2021-12-16
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
相关资源
最近更新 更多