2017-11-04 15 views
0

私は3行を表示する必要があるグラフを用意する必要があります。 1つは新しい問題を1週間表示し、2つは閉じた問題を1週間、3つは開いた問題を1週間表示します。このため、私はクエリを用意して2つの別々のリストを作成することができました.1つのリストは毎週の新しい問題の数を維持し、2つ目のリストは毎週の閉じた問題の数を維持します。私は特定の週のためのオープンな問題の合計数のために得る上記のデータから、2リスト間の値の比較と共通要素の値の減算 - C#

[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 = 5 } 

私は特定の週のために閉じられた問題の総数のために得る上記のデータから。ここで

は、これらのリストのためのコードです:

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(); 

まま最後のピースは、一週間の総未解決の問題のためのデータが含まれている必要があり、これらの2つのリストの値を使用して、新しいリストを作成することです。

説明:

  1. 私は上記の2つのリストから週の値を比較する必要があります。
  2. 週の値が等しい場合は、 と、両方のリストの特定の週のCount値の差を計算します。
  3. この新しいリストに週の値とカウントの値(差を計算した後)を保存します。
  4. 週の値が一致しない場合は、そのような値(Weekと Countの両方)を選択し、そのままこの新しいリストに保存します。上記のサンプルデータから、だから、

は、ここに新しいリストが好きでなければならない方法は次のとおりです。

[0]: { Week = {6/14/2015 12:00:00 AM}, Count = 1 } // As is value from first list - openIssuesList 
[1]: { Week = {12/13/2015 12:00:00 AM}, Count = 1 } // As is value from second list - closedIssuesList 
[2]: { Week = {3/5/2017 12:00:00 AM}, Count = 1 } // As is value from first list - openIssuesList 
[3]: { Week = {5/21/2017 12:00:00 AM}, Count = 4 } // As is value from first list - openIssuesList 
[4]: { Week = {6/4/2017 12:00:00 AM}, Count = 7 } // As is value from first list - openIssuesList 
[5]: { Week = {6/11/2017 12:00:00 AM}, Count = 4 } // As is value from first list - openIssuesList 
[6]: { Week = {6/18/2017 12:00:00 AM}, Count = 2 } // As is value from second list - closedIssuesList 
[7]: { Week = {6/25/2017 12:00:00 AM}, Count = 7 } // As is value from first list - openIssuesList 
[8]: { Week = {7/9/2017 12:00:00 AM}, Count = 0 } // These is common week from both lists. Hence we calculate the difference between count values. So 3-3 = 0. 
[9]: { Week = {7/23/2017 12:00:00 AM}, Count = 8 } // As is value from second list - closedIssuesList 
[10]: { Week = {8/6/2017 12:00:00 AM}, Count = 3 } // As is value from second list - closedIssuesList 
[11]: { Week = {9/17/2017 12:00:00 AM}, Count = 5 } // As is value from second list - closedIssuesList 
[12]: { Week = {10/1/2017 12:00:00 AM}, Count = 6 } // As is value from second list - closedIssuesList 

上記のデータから、親切に、このリストの8番目の要素を参照してください。このリストの週7/9/2017は、openIssuesList(第6要素)とclosedIssuesList(第2要素)の両方から共通していました。

このリストを達成するためのコードは何ですか?

注:これらのリストのすべてのDateTime値から自分のコードのTime要素の値を削除しました。したがって、これらのリストには、すべての日付の値が12:00:00 AMで表示されます。

答えて

1

あなたは絶対にLINQソリューションを必要としない場合、あなたは、

public class WeekCount 
{ 
    public DateTime Week { get; set; } 
    public int Count { get; set; } 
} 

ヘルパークラスを作成し、このクラスに

.Select(x => new WeekCount { Week = x.Key, Count = x.Count() }) 

を使用して、あなたの選択を変更し、その後、単純にそれを行うことができます。

var totalIssuesList = openIssuesList.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(closedWeekCount); 
    } 
} 

totalIssuesList = totalIssuesList.OrderBy(twc => twc.Week).ToList(); 
+0

あなたも私の他の同様の質問ではなく、別の最終結果の要件で見ることができますか?リンク:https://stackoverflow.com/questions/47111604/comparing-values-in-historic-manner-between-2-lists-and-increment-the-values-if –

+0

これを選ぶことは正解と同じですより速い@Mike Matの答え –

1

LINQを使用してこれを行うには、これら2つのリストの完全外部結合を検討することができます。

ヘルパークラス:その後、

 // Union left outer join and right outer join to perform full outer join 
     // https://stackoverflow.com/a/5491381/5682608 
     var leftOuterJoin = from newIssue in newIssues 
          join closedIssue in closedIssues 
          on newIssue.Week equals closedIssue.Week 
          into temp 
          from closedIssue in temp.DefaultIfEmpty(new IssueCount { Week = newIssue.Week, Count = 0 }) 
          select new IssueCount 
          { 
           Week = newIssue.Week, 
           Count = newIssue.Count - closedIssue.Count 
          }; 

     var rightOuterJoin = closedIssues.Where(issue => !newIssues.Select(newIssue => newIssue.Week).Contains(issue.Week)); 

     // Modified: Following code can generate duplicated entries when 
     // 2 IssueCounts of the same Week have different values in Count property 
     // 
     //var rightOuterJoin = from closedIssue in closedIssues 
     //      join newIssue in newIssues 
     //      on closedIssue.Week equals newIssue.Week 
     //      into temp 
     //      from newIssue in temp.DefaultIfEmpty(new IssueCount { Week = closedIssue.Week, Count = 0 }) 
     //      select new IssueCount 
     //      { 
     //       Week = closedIssue.Week, 
     //       Count = closedIssue.Count - newIssue.Count 
     //      }; 

     var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin); 

     foreach (var issue in fullOuterJoin.OrderBy(i => i.Week)) 
     { 
      Console.WriteLine($"{issue.Week.ToString("MM/dd/yyyy")} : {issue.Count}"); 
     } 

public class IssueCount 
    { 
     public DateTime Week { get; set; } 
     public int Count { get; set; } 
    } 

この出力すべき

06/14/2015 : 1 
12/13/2015 : 1 
03/05/2017 : 1 
05/21/2017 : 4 
06/04/2017 : 7 
06/11/2017 : 4 
06/18/2017 : 2 
06/25/2017 : 7 
07/09/2017 : 0 
07/23/2017 : 8 
08/06/2017 : 3 
09/17/2017 : 5 
10/01/2017 : 6 
+0

あなたは私の他の似たような質問を見ることができますか?リンク:https://stackoverflow.com/questions/47111604/comparing-values-in-historic-manner-between-2-lists-and-increment-the-values-if –

関連する問題