2016-08-19 7 views
0

私はx人の顧客を持っています。顧客ごとに、List<DateTime>を返すデータベース呼び出しを行います。
各リストは空でも、x個の日付を含むこともできます。
複数のリストをループして新しいリストに保存

私が達成したいのは、顧客ごとに、リストの最初の日付(最も古いもの)を取得し、その日付がリストに含まれている回数を数えてから、その数値を新しいList<int> RegListに保存することです。

各顧客の最初の日はRegListの最初のアイテムとなり、第二日2番目の項目、等

リスト顧客1
{2016年2月19日00:00:00 2016 -02-19夜12時○○分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}

最初の顧客の後で、私のRegListが正しく見える:{2}。 2番目の顧客の後に私のRegListは{5,3,4,3,3,2}のように見えますが間違っています。私はこれをどのようにするべきですか?

EDIT:日付は関係ありません。日付が異なる場合でも、顧客の最初の日付は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"は "List customer two"のどこから来ていますか?私は "2016-04-11 00:00:00"の3つのインスタンスしか見ることができません。 – arbitrarystringofletters

+0

恣意的な文字コード - 私は更新を行った。日付は問題ではありません。顧客の最初の日付は、日付が異なっていても常にRegList [0]に追加する必要があります。 2 + 3は顧客1の場合2、顧客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; 

を参照してください。あなたはGROUPBYを使用して2つの異なる段階でこれを書き換えることができますいずれか

0

変更

RegsList.Insert(i, tempNum); 

RegsList[i] = tempNum; 

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; 
       } 
      } 
     } 
関連する問題