我得到了一个包含许多属性的Collection列表。具体来说,其中3个是:ID1,ID2(IDS是我的表中的键,ID1在这种情况下总是相同的),数量和日期。
一些事实:
让我尝试一下: 样本1:
我需要将元素(ID1 = 1,ID2 = 2,Quanity = 100,Date = 11/10/2011)添加到结果列表中。重复2次,并且比日期为11/09/2011的记录更新
样本2:
我需要添加元素(记录4:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/07/2011)。即使数量为100和120的2条记录相同,最新的也是2011年7月11日。
样本3:
我需要添加元素(记录3:ID1 = 1,ID2 = 2,Quanity = 120,Date = 11/05/2011)。即使有了11月11日的记录,120个数量重复了3次,所以我得到了这个数量的最新记录。
样本4:
我需要添加记录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个数量的寄存器
答案 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);
}