2017-01-11 6 views
0

いくつかの事前設定ルールに基づいてデータをセグメントにグループ化する必要があります。私は5分間隔で、時には5分以上で入力データを取りました。 さらなる処理のためにそれらをセグメントに入れる必要がありますが、何らかの理由で私のためには機能しません。データのルールに基づいたデータのセグメントへのグループ化LINQ

例:

11.01.2017 14:59:19 +01:00 value 15 
11.01.2017 15:04:19 +01:00 value 17 
11.01.2017 15:09:19 +01:00 value 14 
11.01.2017 15:14:19 +01:00 value 11 
11.01.2017 15:19:19 +01:00 value 0 
11.01.2017 15:24:19 +01:00 value 8 
---------here I want divide--------- 
11.01.2017 15:49:19 +01:00 value 6 
11.01.2017 15:54:19 +01:00 value 14 
11.01.2017 15:59:19 +01:00 value 5 
11.01.2017 16:04:19 +01:00 value 3 
11.01.2017 16:09:19 +01:00 value 5 

ここではサンプルコードである:http://rextester.com/GQW59118

例では二つのセグメントが存在しなければなりません。

私は誰にも助言してくださいすることができ、この

var grouped = dataList.GroupBy(tv => /*group when is dataList[i]-dataList[i-1]==5 */) 
       .Select(g => g.OrderBy(tv => tv.dateTime).ToList() 
       ).ToList(); 

ようなものが必要?

+1

の値を変更することによって、それを変更することも、問題のコードを投稿してください。あなたはそれにリンクしている場合。 – juharr

+0

なぜ配列にlinqを使いたいのですか? linqはxmlやdbに適しています。単純なループと追加構造を使用します。 –

+1

@AlexeyObukhov LINQ to Objectsは、読みやすいので、しばしばメンテナンスが容易です。また、XMLやDBだけでなく、Webベースの多くのデータソースに対してLINQを使用することができます。 –

答えて

0

(ループ内であればなし)この試してみてください:あなたは、時間間隔5分を持っているがあり

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     List<TimeValue> ttcaList = new List<TimeValue>(); 

     Random s = new Random(); 
     DateTimeOffset dto = DateTimeOffset.Now; 


     for (int i = 0; i < 6; i++) 
     { 
      ttcaList.Add(new TimeValue(dto.AddMinutes(i*5), s.Next(0, 20))); 
     } 
     for (int i = 0; i < 5; i++) 
     { 
      ttcaList.Add(new TimeValue(dto.AddMinutes(10*5).AddMinutes(i*5), s.Next(0, 20))); 
     } 


     foreach (var item in ttcaList) 
     { 
      Console.WriteLine(item.Time+" value "+ item.Value); 
     } 

     List<List<TimeValue>> grouped = new List<List<TimeValue>>(); 

     var interval = 5; 
     DateTimeOffset lastTime = new DateTimeOffset(); 

     foreach (var item in ttcaList) 
     { 

      if (grouped.Count == 0) 
      { 
       grouped.Add(new List<TimeValue>() {item}); 
       lastTime = item.Time; 
      } 
      else 
      { 
       if ((item.Time - lastTime).TotalMinutes <= interval) 
        grouped.Last().Add(item); 
       else 
        grouped.Add(new List<TimeValue>() {item}); 

       lastTime = item.Time; 
      } 
     } 

     Console.WriteLine("\n\n grouped data"); 

     foreach (var skup in grouped) 
     { 
      Console.WriteLine("\t\t group"); 
     foreach (var item in skup) 
     { 

      Console.WriteLine(item.Time+" value "+ item.Value); 
     } 
     } 
    } 

を、あなたはinterval

+0

私は私の答えを編集しました。どうぞご覧ください。 – VDN

+0

私はこれが好きです。私はそれをLINQで解決したいが、おそらくそれは不可能である。 –

関連する問題