首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以历史的方式比较两个列表之间的值,并增加if元素来自第一个列表的值,如果是来自第二个列表的话,则为C#。

以历史的方式比较两个列表之间的值,并增加if元素来自第一个列表的值,如果是来自第二个列表的话,则为C#。
EN

Stack Overflow用户
提问于 2017-11-04 14:07:58
回答 2查看 69关注 0票数 0

我需要准备一个图表,其中我需要显示3行。一次是一周的新发行,第二次是一周的闭幕式发行,第三次是从第一周到上周的累计发行。。

因此,我准备了一个查询,并成功地创建了两个单独的列表--一个列表保持每周新问题的计数,第二个列表保持每周结束问题的计数。

以下是第一份清单的样本数据(一份保持新问题):

代码语言:javascript
复制
        [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 }

从上面的数据中,我得到了某一周待处理问题的总数。

注意:对于这两个列表,周值都包含周日的日期。,因为我需要周从星期一开始,同时在图表中显示数据。

同样,对于第二份清单的样本数据(保持未决问题的数据):

代码语言:javascript
复制
[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 }

从上述数据中,我得到了某一周已结束发行的总数。

下面是这些列表的代码:

代码语言:javascript
复制
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();

现在剩下的最后一部分是使用这两个列表中的值来创建一个新的列表,该列表应该包含一个星期内所有未解决问题的数据。

说明:

  1. 我需要比较从上述两个列表的周值,以历史的方式(最老到最新)。
  2. 从这两个列表中提取最古老的周值。(从上面的样本数据来看,应该是6/14/2015,即openIssuesList。)继续从上面的2个列表中以这种方式获取周数(从最老到最新)。
  3. 如果周值来自openIssuesList,即first list,则通过将计数值与以前获取的元素(现在出现在新的第三列表中)的计数值相加(如果有的话),从而增加计数值。
  4. 如果周值来自closedIssuesList,即第二列表,那么通过减去以前获取的元素的计数值(现在出现在新的第三列表中)(如果有的话)来减少计数值。
  5. 如果周值相等(如示例数据中的7/9/2017 ),则first 将openIssues列表的计数值添加到以前获取的元素(现在出现在新的第三个列表中)E 248(如果有的话),然后<>E 149减去E 250E 151新计算的值E 252与E 153计数E 254>代码>的值。

因此,从上面提供的示例数据来看,新列表应该是什么样的:

代码语言:javascript
复制
[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。。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-04 14:37:06

将所有问题按周分组,然后根据当前总数以及给定周的待决和已结束问题之和计算计数:

代码语言:javascript
复制
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)
                   };

您不需要两个列表来计算这个统计数据。如果您需要这些列表用于其他目的,那么您可以简单地将它们连接起来并使用

代码语言:javascript
复制
from issue in openIssuesList.Concat(closedIssuesList)

三个星期的测试数据

代码语言:javascript
复制
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" }
};

输出:

代码语言:javascript
复制
[
  { "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
]

扩展方法用于可读性:

代码语言:javascript
复制
public static class DateTimeExtensions
{
    public static DateTime EndOfWeek(this DateTime date) => 
       date.AddDays(date.DayOfWeek == DayOfWeek.Sunday ? 0 : 7 - (int)date.DayOfWeek).Date;
}

注意:与字符串不同,考虑将枚举用于问题状态

票数 2
EN

Stack Overflow用户

发布于 2017-11-04 14:32:28

基于my previous answer,我扩展了helper类

代码语言:javascript
复制
public class WeekCount
{
    public DateTime Week { get; set; }
    public int Count { get; set; }
    public bool IsOpen { get; set; }
}

,您仍然需要修改您的选择来使用它。

代码语言:javascript
复制
.Select(x => new WeekCount { Week = x.Key, Count = x.Count() })

,代码变成:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47111604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档