2016-08-19 60 views
0

我有x個客戶。對於每個客戶,我進行數據庫調用,返回List<DateTime>
每個列表可以爲空或包含x個日期。
通過多個列表循環並保存到新列表

我想要實現的是,對於每個客戶,我從列表中選取第一個日期(最早的),計算該日期在列表中的次數,然後將該數字保存到新的List<int> RegList

每個客戶的第一個日期成爲RegList中的第一項,第二日期的第二項,等等

列表顧客一個
{2016年2月19日00:00:00,2016 -02-19 00:00:00}

RegList現在應該:{2}

名單客戶2
{2016年4月22日00:00:00,2016-04-22 00:00:00,2016-04-22 00:00:00,2016-04-25 00:00:00,2016-04-26 00:00:00, 2016-04-26 00:00:00,2016-05-02 00:00:00,2016-05-10 00:00:00}

RegList現在應該是:{2 + 3,1,2 ,1,1} = {5,1,2,1,1}

在第一個客戶my RegList看起來正確之後:{2}。 第二位顧客my RegList看起來像這樣:{5,3,4,3,3,2},這是錯誤的。我應該怎麼做?

編輯:日期並不重要。即使日期不同,任何客戶的第一個日期都應添加到Reglist中的第一個項目。

private void CalculateRegs(List<DateTime> eventList) 
{    
    int num = 0;   
    int i = 0; 

    var distinctList = eventList.Distinct().ToList(); 

    foreach (var date in distinctList) 
    { 
     num = eventList.Where(x => x.Equals(date)).Count(); 
     if (RegsList.Count() <= i) 
     { 
      RegsList.Add(num); 
     } 
     else 
     { 
      var tempNum = num + RegsList.ElementAt(i); 
      RegsList.Insert(i, tempNum); 
     } 
     i++; 
    }   
    } 
+1

那豈不是更容易通過簡單地使用組? –

+0

來自「列出客戶二」的「2 + 3」在哪裏?我只看到「2016-04-11 00:00:00」的三個實例。 – arbitrarystringofletters

+0

arbitrarystringofletters - 我做了更新。日期無關緊要,即使日期不同,客戶的第一次約會也應始終添加到RegList [0]。 2 + 3來自顧客1和顧客2 3。 – Andy

回答

0

也許只是將所有日期導入到列表中,然後再執行該過程也許比較容易。

類似這樣;

//Create a list of all the dates from your customers 
var dates = new List<DateTime>(); 
foreach(var customer in Customers) 
{ 
    List<DateTime> customerDates = database.GetDates(customer); 
    dates.AddRange(customerDates); 
} 

//You can either just take the count of all the dates 
List<int> RegsList = new List<int>(); 
var group = dates.GroupBy(d => d) 
       .Select(group => group.Count()); 

RegsList.AddRange(group); 

//Or put them in some other collection to know which date has which count 
//for example, a Dictionary 
Dictionary<DateTime, int> OtherRegsList = new Dictionary<DateTime, int>(); 
var group2 = dates.GroupBy(d => d) 
       .Select(group => new { Date = group.Key, Count = group.Count() }); 

foreach(var g in group2) 
{ 
    OtherRegsList.Add(g.Date, g.Count); 
} 
+0

謝謝迪翁,我會試試這個! – Andy

0

(想想做這個數據庫端)

void Main() 
{ 
    List<Customer> customers = new List<Customer> { 
     new Customer { 
      CustomerId=1, 
      Events = new List<Event> { 
       new Event {EventId=1, CustomerId=1, EventDate=new DateTime(2016,2,19)}, 
       new Event {EventId=2, CustomerId=1, EventDate=new DateTime(2016,2,19)}, 
      } 
     }, 
     new Customer { 
      CustomerId = 2, 
      Events = new List<Event> { 
       new Event {EventId=6, CustomerId=2, EventDate=new DateTime(2016,4,25)}, 
       new Event {EventId=7, CustomerId=2, EventDate=new DateTime(2016,4,25)}, 
       new Event {EventId=3, CustomerId=2, EventDate=new DateTime(2016,4,22)}, 
       new Event {EventId=4, CustomerId=2, EventDate=new DateTime(2016,4,22)}, 
       new Event {EventId=5, CustomerId=2, EventDate=new DateTime(2016,4,22)}, 
       new Event {EventId=8, CustomerId=2, EventDate=new DateTime(2016,4,26)}, 
       new Event {EventId=8, CustomerId=2, EventDate=new DateTime(2016,4,26)}, 
      } 
     }, 
    }; 

    var counts = from c in customers 
       select new { 
        c.CustomerId, 
        Counts = c.Events 
         .GroupBy(e => e.EventDate) 
         .Select(e => new {Date= e.Key,Count= e.Count()}) 
         .OrderBy(e => e.Date) 
       }; 
} 

public class Customer 
{ 
    public int CustomerId { get; set; } 
    public virtual List<Event> Events {get;set;} 
} 

public class Event 
{ 
    public int EventId {get;set;} 
    public DateTime EventDate { get; set; } 
    public int CustomerId { get; set; } 
} 
0

通過查看您從您的數據後,第二次列表進行迭代,即{5,1,2,1,1}看起來期待值就像您希望爲每個客戶日期列表添加日期事件的數量一樣。 一件事,不右看看是您更換值

RegsList.Insert(i, tempNum); 

這是錯誤的,因爲它只是推前值到下一個索引做插入。 嘗試與這一個替換上述行:

RegsList[i] = tempNum; 

看看它是否工作。

0

變化

RegsList.Insert(i, tempNum); 

RegsList[i] = tempNum; 

您可以使用GROUPBY在兩個不同的步驟改寫這個

private void CalculateRegs(List<DateTime> eventList) 
     { 
      Dictionary<DateTime, int> counts = eventList.GroupBy(x => x) 
       .ToDictionary(g => g.Key, g => g.Count()); 

      // merge with reglist 
      for (int i = 0; i < counts.Count; i++) 
      { 
       var el = counts.ElementAt(i); 
       if (RegsList.Count <= i) 
       { 
        RegsList.Add(counts.ElementAt(i).Value); 
       } 
       else 
       { 
        var tempNum = el.Value + RegsList.ElementAt(i); 
        RegsList[i] = tempNum; 
       } 
      } 
     }