2017-10-19 144 views
1

我做了一個臨時應用程序來模仿一些行爲,我需要將它合併到一個Web服務中,該服務從數據庫返回數據並使用返回的數據創建動態Google圖表。將項目添加到列表<Tuple>在另一個列表內

到目前爲止,這裏是我

class Program 
{ 
    static void Main(string[] args) 
    { 

     var tupleMissingBeginning = new List<Tuple<DateTime, int>> 
     { 
      Tuple.Create(new DateTime(2017, 5, 1), 25), 
      Tuple.Create(new DateTime(2017, 6, 1), 35) 
     }; 

     var tupleMissingMiddle = new List<Tuple<DateTime, int>> 
     { 
      Tuple.Create(new DateTime(2016, 12, 1), 25), 
      Tuple.Create(new DateTime(2017, 1, 1), 20), 
      Tuple.Create(new DateTime(2017, 2, 1), 30), 
      Tuple.Create(new DateTime(2017, 3, 1), 25), 
      Tuple.Create(new DateTime(2017, 6, 1), 35) 
     }; 

     var tupleMissingEnd = new List<Tuple<DateTime, int>> 
     { 
      Tuple.Create(new DateTime(2017, 1, 1), 20), 
      Tuple.Create(new DateTime(2017, 2, 1), 30), 
      Tuple.Create(new DateTime(2017, 3, 1), 25) 
     }; 

     var tupleMissingBeginningAndEnd = new List<Tuple<DateTime, int>> 
     { 
      Tuple.Create(new DateTime(2017, 3, 1), 20), 
      Tuple.Create(new DateTime(2017, 4, 1), 30), 
      Tuple.Create(new DateTime(2017, 5, 1), 25) 
     }; 

     DateTime minDate = DateTime.MaxValue; 
     DateTime maxDate = DateTime.MinValue; 

     Console.WriteLine("MinDate: " + minDate); 
     Console.WriteLine("MaxDate: " + maxDate); 
     Console.WriteLine(""); 

     List<List<Tuple<DateTime, int>>> myList = new List<List<Tuple<DateTime, int>>>(); 

     myList.Add(tupleMissingBeginning); 
     myList.Add(tupleMissingMiddle); 
     myList.Add(tupleMissingEnd); 
     myList.Add(tupleMissingBeginningAndEnd); 

     foreach (var item in myList) 
     { 
      for (int i = 0; i < item.Count; i++) 
      { 
       Console.WriteLine(item[i] + " . . . . MinDate: " + minDate + ", MaxDate: " + maxDate); 
       if (item[i].Item1 < minDate) 
       { 
        minDate = item[i].Item1; 
       } 
       if (item[i].Item1 > maxDate) 
       { 
        maxDate = item[i].Item1; 
       } 

      } 
      Console.WriteLine(); 
     } 

     Console.WriteLine(); 
     Console.WriteLine("MinDate: " + minDate); 
     Console.WriteLine("MaxDate: " + maxDate); 


     foreach (var item in myList) // for each list<tuple<DateTime, int>> in myList, 
     { 

      while (minDate <= maxDate) 
      { 
       Console.WriteLine(minDate); 
       minDate = minDate.AddMonths(1); 
      } 
     } 
    } 
} 

輸出看起來是這樣的: image of output

某處,不知何故在第二圈我需要使用的minDate和的maxDate能夠檢查無論該特定列表是否存在該地點的項目。基本上,由於minDate是12/1/2016和maxDate是2017年6月1日(這些只是任意日期,可以是任何東西),我需要確保每個List<Tuple<DateTime, int>>包含相同數量的元素,如果在該索引沒有任何內容,我可以在該月的第一天插入0。

我已經嘗試使用for循環使用原始的DateTimes作爲索引器和條件以及使用月份,但遇到了新的問題以及插入值的整個過程。

編輯:這是我目前有:

 foreach (var item in myList) // for each list<tuple<DateTime, int>> in myList, 
     { 
      DateTime newDate = minDate; 
      while (newDate <= maxDate) 
      { 
       //Console.WriteLine(minDate); 
       for (int i = 0; i < item.Count; i++) 
       { 
        bool containsDate = item.Any(D => D.Item1 == newDate); 
        if (!containsDate) 
        { 
         item.Insert(i, new Tuple<DateTime, int>(newDate, 0)); 
        } 
       } 
       newDate = newDate.AddMonths(1); 
      } 
     } 

產生以下輸出: second output image

所以它只是存在,它增加了所有它只是不把他們的0在正確的地方。

回答

2

我想我找出了你的問題。通常很難通過foreach來修改你正在迭代的內容。

該解決方案將遍歷最小值和最大值之間的每個月。它會遍歷每個列表。如果該列表沒有那個月,那麼它被插入到列表中。

for (int i = 0; minDate <= maxDate; i++) 
{ 
    for (int list = 0; list < myList.Count; list++) 
    { 
     if (myList[list].Count <= i || myList[list][i].Item1 != minDate) 
     { 
      myList[list].Insert(i, Tuple.Create(minDate, 0)); 
     } 
    } 

    minDate = minDate.AddMonths(1); 
} 

您也可以使用日期作爲迭代器和排序在最後:

for (var i = minDate; i <= maxDate; i = i.AddMonths(1)) 
{ 
    for (int list = 0; list < myList.Count; list++) 
    { 
     if (!myList[list].Any(tuple => tuple.Item1 == i)) 
     { 
      myList[list].Add(Tuple.Create(i, 0)); 
     } 
    } 
} 

myList.ForEach(item => item.Sort((x, y) => x.Item1.CompareTo(y.Item1))); 

您也可以通過第一平整的最小值和最大值:

var dates = myList.SelectMany(list => list).Select(item => item.Item1); 
minDate = dates.Min(); 
maxDate = dates.Max(); 
+0

我是如此關!我將添加到原始帖子的編輯中。非常感謝您的解決方案。 – Mkalafut

+0

沒問題。 :-) –

+0

亞當,再次感謝。編輯超出了我的期望。非常有用的東西! – Mkalafut

相關問題