我需要准备一个图表,其中我需要显示3行。一次是一周的新发行,第二次是一周的闭幕式发行,第三次是从第一周到上周的累计发行。。
因此,我准备了一个查询,并成功地创建了两个单独的列表--一个列表保持每周新问题的计数,第二个列表保持每周结束问题的计数。
以下是第一份清单的样本数据(一份保持新问题):
[0]: { Week = {6/14/2015 12:00:00 AM}, Count = 1 }
[1]: { Week = {3/5/2017 12:00:00 AM}, Count = 1 }
[2]: { Week = {5/21/2017 12:00:00 AM}, Count = 4 }
[3]: { Week = {6/4/2017 12:00:00 AM}, Count = 7 }
[4]: { Week = {6/11/2017 12:00:00 AM}, Count = 4 }
[5]: { Week = {6/25/2017 12:00:00 AM}, Count = 7 }
[6]: { Week = {7/9/2017 12:00:00 AM}, Count = 3 }从上面的数据中,我得到了某一周待处理问题的总数。
注意:对于这两个列表,周值都包含周日的日期。,因为我需要周从星期一开始,同时在图表中显示数据。
同样,对于第二份清单的样本数据(保持未决问题的数据):
[0]: { Week = {12/13/2015 12:00:00 AM}, Count = 1 }
[1]: { Week = {7/9/2017 12:00:00 AM}, Count = 3 }
[2]: { Week = {6/18/2017 12:00:00 AM}, Count = 2 }
[3]: { Week = {7/23/2017 12:00:00 AM}, Count = 8 }
[4]: { Week = {10/1/2017 12:00:00 AM}, Count = 6 }
[5]: { Week = {8/6/2017 12:00:00 AM}, Count = 3 }
[6]: { Week = {9/17/2017 12:00:00 AM}, Count = 1 }从上述数据中,我得到了某一周已结束发行的总数。
下面是这些列表的代码:
var openIssuesList = getDetails.Where(x => x.ChangedTo == "Open").Select(x => new { Week = x.Date.AddDays(x.Date.DayOfWeek == DayOfWeek.Sunday ? 0 : 7 - (int)x.Date.DayOfWeek).Date, Detail = x }).GroupBy(x => x.Week).Select(x => new { Week = x.Key, Count = x.Count() }).ToList();
var closedIssuesList = getDetails.Where(x => x.ChangedTo == "Closed").Select(x => new { Week = x.Date.AddDays(x.Date.DayOfWeek == DayOfWeek.Sunday ? 0 : 7 - (int)x.Date.DayOfWeek).Date, Detail = x }).GroupBy(x => x.Week).Select(x => new { Week = x.Key, Count = x.Count() }).ToList();现在剩下的最后一部分是使用这两个列表中的值来创建一个新的列表,该列表应该包含一个星期内所有未解决问题的数据。
说明:
E 248(如果有的话),然后<>E 149减去E 250此E 151新计算的值E 252与E 153计数E 254>代码>的值。因此,从上面提供的示例数据来看,新列表应该是什么样的:
[0]: { Week = {6/14/2015 12:00:00 AM}, Count = 1 } // 0+1 = 0 : Oldest week value of all - (fetched from openIssuesList)
[1]: { Week = {12/13/2015 12:00:00 AM}, Count = 0 } // 1-1 = 0 (fetched from closedIssuesList)
[2]: { Week = {3/5/2017 12:00:00 AM}, Count = 1 } // 0+1 = 1 - (fetched from openIssuesList)
[3]: { Week = {5/21/2017 12:00:00 AM}, Count = 5 } // 1+4 = 5 - (fetched from openIssuesList)
[4]: { Week = {6/4/2017 12:00:00 AM}, Count = 12 } // 5+7 = 12 - (fetched from openIssuesList)
[5]: { Week = {6/11/2017 12:00:00 AM}, Count = 16} // 12+4 = 16 - (fetched from openIssuesList)
[6]: { Week = {6/18/2017 12:00:00 AM}, Count = 14 } // 16-2 = 14 (fetched from closedIssuesList)
[7]: { Week = {6/25/2017 12:00:00 AM}, Count = 21 } //14+7 = 21 (fetched from openIssuesList)
[8]: { Week = {7/9/2017 12:00:00 AM}, Count = 21 } // These is common week from both lists. So 20 + (openIssuesList Count value) - (closedIssuesList Count value) i.e [21 + 3 - 3 = 21].
[9]: { Week = {7/23/2017 12:00:00 AM}, Count = 13 } // 21-8 = 13 (fetched from closedIssuesList)
[10]: { Week = {8/6/2017 12:00:00 AM}, Count = 10 } // 13-3 = 10 (fetched from closedIssuesList)
[11]: { Week = {9/17/2017 12:00:00 AM}, Count = 9 } // 10-1 = 9 (fetched from closedIssuesList)
[12]: { Week = {10/1/2017 12:00:00 AM}, Count = 3 } // 9-6 = 3 (fetched from closedIssuesList)从以上数据中,请参阅此列表中的第8个元素。2017年9月7日这一周的来自openIssuesList (第6元素)和closedIssuesList (第2元素)
实现此列表的代码是什么?
注意:我必须从这些列表中的所有DateTime值中删除代码中的时间元素值。因此,所有的日期值都出现在这些列表中的12:00上午12:00。。
发布于 2017-11-04 14:37:06
将所有问题按周分组,然后根据当前总数以及给定周的待决和已结束问题之和计算计数:
int totalCount = 0;
var issuesByWeek = from issue in getDetails
where issue.ChangedTo == "Open" || issue.ChangedTo == "Closed"
group issue by issue.Date.EndOfWeek() into g
orderby g.Key
select new
{
Week = g.Key,
Count = totalCount += g.Sum(i => i.ChangedTo == "Open" ? 1 : -1)
};您不需要两个列表来计算这个统计数据。如果您需要这些列表用于其他目的,那么您可以简单地将它们连接起来并使用
from issue in openIssuesList.Concat(closedIssuesList)三个星期的测试数据
var issues = new[]
{
new Issue { Date = DateTime.Today.AddDays(-16), ChangedTo = "Open" },
new Issue { Date = DateTime.Today.AddDays(-15), ChangedTo = "Unknown" },
new Issue { Date = DateTime.Today.AddDays(-15), ChangedTo = "Open" },
new Issue { Date = DateTime.Today.AddDays(-9), ChangedTo = "Closed" },
new Issue { Date = DateTime.Today.AddDays(-8), ChangedTo = "Open" },
new Issue { Date = DateTime.Today.AddDays(-6), ChangedTo = "Closed" },
new Issue { Date = DateTime.Today.AddDays(-5), ChangedTo = "Closed" }
};输出:
[
{ "Week": "2017-10-22T00:00:00+03:00", "Count": 2 }, // 0 + 2
{ "Week": "2017-10-29T00:00:00+03:00", "Count": 1 }, // 2 + 1 - 2
{ "Week": "2017-11-05T00:00:00+03:00", "Count": 0 } // 1 - 1
]扩展方法用于可读性:
public static class DateTimeExtensions
{
public static DateTime EndOfWeek(this DateTime date) =>
date.AddDays(date.DayOfWeek == DayOfWeek.Sunday ? 0 : 7 - (int)date.DayOfWeek).Date;
}注意:与字符串不同,考虑将枚举用于问题状态
发布于 2017-11-04 14:32:28
基于my previous answer,我扩展了helper类
public class WeekCount
{
public DateTime Week { get; set; }
public int Count { get; set; }
public bool IsOpen { get; set; }
},您仍然需要修改您的选择来使用它。
.Select(x => new WeekCount { Week = x.Key, Count = x.Count() }),代码变成:
var totalIssuesList = openIssuesList.Select(o => new WeekCount { Week = o.Week, Count = o.Count, IsOpen = true }).ToList();
foreach (var closedWeekCount in closedIssuesList)
{
var totalWeekCount = totalIssuesList.FirstOrDefault(owc => owc.Week == closedWeekCount.Week);
if (totalWeekCount != null)
{
totalWeekCount.Count = totalWeekCount.Count - closedWeekCount.Count;
}
else
{
totalIssuesList.Add(new WeekCount { Week = closedWeekCount.Week, Count = closedWeekCount.Count, IsOpen = false });
}
}
totalIssuesList = totalIssuesList.OrderBy(twc => twc.Week).ToList();
var currentCount = 0;
foreach (var totalWeekCount in totalIssuesList)
{
if (totalWeekCount.IsOpen)
{
currentCount += totalWeekCount.Count;
}
else
{
currentCount -= totalWeekCount.Count;
}
totalWeekCount.Count = currentCount;
}请注意,您的一些计算是错误的,应该是,例如:
4:{周= {6/4/2017 12 :00 AM},计数= 12 } // 5+7 =12
https://stackoverflow.com/questions/47111604
复制相似问题