【发布时间】:2016-01-04 23:36:20
【问题描述】:
我有一个 C# 应用程序,我正在从跟踪人们请求的外部跟踪系统中提取数据,并将它们存储在我的数据库中。所以是这样的:
public class Request
{
public DateTime Start {get;set;}
public DateTime End {get;set;}
public int PersonId {get;set;}
}
IEnumerable<Request> requests = GetExternalRequests();
GetExternalRequests() 的详细信息与问题无关。
问题是服务会分解事情以在每一天向我发送请求(即使请求是多天请求)
例如,如果一个人提出一整周(周一至周五)的请求,我会在数组中获得 5 个不同的项目(每个项目都有一个日期),我想将它们“合并”成一个使用 Start = Monday 和 End = Friday 的请求以避免将 5 条不同的记录保存到我的数据库中。
到目前为止,我现在有一个感觉很不优雅的解决方案,我循环遍历所有请求并将结果放入字典中,然后运行下面的代码
IEnumerable<Request> requests = GetExternalRequests();
IEnumerable<Request> previousRequests = GetAllPreviousRequests();
Dictionary<string, Request> cachedDictionary = CacheAllRequestsByDateandPersonId(requests, previousRequests)
var groupedByPerson = requests.GroupBy(r=>r.PersonId);
foreach (var group in groupedByPerson)
{
foreach (Request request in group.OrderBy(r=>r.StartDate)
{
var offSet = 1;
if (request.StartDate.DayOfWeek == DayOfWeek.Friday)
{
offSet = 3;
}
if (cachedDictionary.ContainsKey(request.PersonId + request.StartDate.AddDays(offset))
{
//delete the request from the list and change the start date of the next request to the start date of this request.
}
}
}
所以我想获得一些建议,看看是否有更优雅的方式来“合并”这些结果。
为了增加一些清晰度(基于下面的一些 cmets)
- 请求不能重叠(想想休假请求)
- 如果我在星期一已经有一个先前的请求,而在星期二又收到了一个新请求,那么我也想合并这些请求
【问题讨论】:
-
什么是
MergeAlignedRequests? - 似乎是与问题最相关的方法?此外,这是合并所有请求在插入之前,还是您还想合并现有请求? (例如,他们在星期一提出请求,然后在星期二也提出请求?) -
cacheRequest是什么类型?分配在哪里? -
只有
Request.Start和Request.End中的Day相关吗? -
一般来说,您能对
Request.Start或Request.End做出任何假设吗?会不会有重叠的请求? -
@Rob - 这是一个错字。我为问题移动了内联函数
标签: c# collections merge