2016-11-10 10 views
0
によって順序

私はテーブル持っ を助ける必要があります。LINQのグループ、値

Id   Day     Group  Value 
------------------------------------------------- 
    1   2016-10-11   1   10.5 
    2   2016-10-11   1   10.8 
    3   2016-10-11   1   10.7 
    4   2016-10-11   1   10.6 
    5   2016-10-11   1   10.5 
    6   2016-10-11   1   10.4 
    7   2016-10-11   1   10.8 
    8   2016-10-11   1   10.2 
    9   2016-10-11   1   10.0 
    10   2016-10-11   1   10.9 
    11   2016-10-11   2   10.1 
    12   2016-10-11   2   10.0 
    13   2016-10-11   2   10.1 
    14   2016-10-11   2   10.6 
    15   2016-10-11   2   10.7 
    16   2016-10-11   2   10.2 
    17   2016-10-11   2   10.0 
    18   2016-10-11   2   10.5 
    19   2016-10-11   2   10.5 
    20   2016-10-11   2   10.8 
    21   2016-10-12   1   11.1 
    22   2016-10-12   1   11.7 
    23   2016-10-12   1   11.0 
    24   2016-10-12   1   11.4 
    25   2016-10-12   1   11.7 
    26   2016-10-12   1   11.8 
    27   2016-10-12   1   11.1 
    28   2016-10-12   1   11.1 
    29   2016-10-12   1   11.4 
    30   2016-10-12   1   11.6 
    31   2016-10-12   2   11.9 
    32   2016-10-12   2   11.6 
    ... 

そして、私は

  • グループデー
  • によってグループが値によって
  • グループを

    • オーダーをしたいです
    • のような値を得てください:
    それぞれ

    [[[10.5,10.8],[10.0,10.1]],[[11.1,11.7],[11.6,11.9]]](例)

    私は例のように値を得るとき、私は日中より多くの価値を取得し、より多くのこの値で作業する必要があります。そして、私はこのバッチを4バッチに分割し、その後、すべてのグループから最初の値を選びます。だから私は各グループに4つの価値があり、1日には2つのバッチがあり、すべてのバッチは4つの価値を持つことになります。すべてのバッチで最後の値のような5つの値を持つ必要があるため、Max Valueを見つけて4つの値を持つバッチに追加します。あなたが理解していれば私は私のコードがあるかわからない:

    ​​

    更新:

    この作品:

    var result = db.Values 
        .Where(x => (DbFunctions.TruncateTime(x.Day)) >= startDate 
        && (DbFunctions.TruncateTime(x.Day)) <= endDate) 
        .GroupBy(x => new { Day = x.Day, Group = x.Group }) 
        .Select(x => x.Select(y => y.Value).OrderBy(z => z).ToList()).ToList(); 
    

    私はこの取得:

    [ 
    [10.0, 10.2, 10.4, 10.5, 10.5, 10.6, 10.7, 10.8, 10.8, 10.9], 
    [10.0, 10.0, 10.1, 10.1, 10.2, 10.5, 10.5, 10.6, 10.7, 10.8], 
    [11.0, 11.1, 11.1, 11.1, 11.4, 11.4, 11.6, 11.7, 11.7, 11.8], 
    [...] 
    ] 
    

    しかし、私をこの場合は2つの部分に分割し、この部分から最初の値を選択する必要があります。

    [ 
    [10.0, 10.6, 10.9], 
    [10.0, 10.2, 10.8], 
    [11.0, 11.4, 11.8], 
    [...] 
    ] 
    

    私はこの方法を使用する分割の場合:

    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int length) 
         { 
          if (length <= 0) 
           throw new ArgumentOutOfRangeException("length"); 
    
          var section = new List<T>(length); 
    
          foreach (var item in source) 
          { 
           section.Add(item); 
    
           if (section.Count == length) 
           { 
            yield return section.AsReadOnly(); 
            section = new List<T>(length); 
           } 
          } 
    
          if (section.Count > 0) 
           yield return section.AsReadOnly(); 
         } 
    
  • +0

    ので、あなたが文でグループによって失われるいくつかの値をCONCATたいです。 linqによってこれらの値を連結することに関する質問があります:[link](http://stackoverflow.com/questions/18203169/field-concatenation-based-on-group-in-linq)グループを何度でも使用し、値を連結します。その後、結果のデータを注文することができます。 – Jenism

    答えて

    1

    私の最終的な結果がされるこの例のように、だから私は、2値を持つことになり、その後、私はこのバッチから2値の最大値に連結したいですここで私はそれをやったかのサンプルがあります。この

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Data; 
    
    namespace ConsoleApplication23 
    { 
        class Program 
        { 
         static void Main(string[] args) 
         { 
    
          DataTable dt = new DataTable(); 
          dt.Columns.Add("ID", typeof(int)); 
          dt.Columns.Add("Day", typeof(DateTime)); 
          dt.Columns.Add("Group", typeof(int)); 
          dt.Columns.Add("Value", typeof(decimal)); 
    
          dt.Rows.Add(new object[] {1 , DateTime.Parse("2016-10-11"), 1, 10.5}); 
          dt.Rows.Add(new object[] {2 , DateTime.Parse("2016-10-11"), 1, 10.8}); 
          dt.Rows.Add(new object[] {3 , DateTime.Parse("2016-10-11"), 1, 10.7}); 
          dt.Rows.Add(new object[] {4 , DateTime.Parse("2016-10-11"), 1, 10.6}); 
          dt.Rows.Add(new object[] {5 , DateTime.Parse("2016-10-11"), 1, 10.5}); 
          dt.Rows.Add(new object[] {6 , DateTime.Parse("2016-10-11"), 1, 10.4}); 
          dt.Rows.Add(new object[] {7 , DateTime.Parse("2016-10-11"), 1, 10.8}); 
          dt.Rows.Add(new object[] {8 , DateTime.Parse("2016-10-11"), 1, 10.2}); 
          dt.Rows.Add(new object[] {9 , DateTime.Parse("2016-10-11"), 1, 10.0}); 
          dt.Rows.Add(new object[] {10, DateTime.Parse("2016-10-11"), 1, 10.9}); 
          dt.Rows.Add(new object[] {11, DateTime.Parse("2016-10-11"), 2, 10.1}); 
          dt.Rows.Add(new object[] {12, DateTime.Parse("2016-10-11"), 2, 10.0}); 
          dt.Rows.Add(new object[] {13, DateTime.Parse("2016-10-11"), 2, 10.1}); 
          dt.Rows.Add(new object[] {14, DateTime.Parse("2016-10-11"), 2, 10.6}); 
          dt.Rows.Add(new object[] {15, DateTime.Parse("2016-10-11"), 2, 10.7}); 
          dt.Rows.Add(new object[] {16, DateTime.Parse("2016-10-11"), 2, 10.2}); 
          dt.Rows.Add(new object[] {17, DateTime.Parse("2016-10-11"), 2, 10.0}); 
          dt.Rows.Add(new object[] {18, DateTime.Parse("2016-10-11"), 2, 10.5}); 
          dt.Rows.Add(new object[] {19, DateTime.Parse("2016-10-11"), 2, 10.5}); 
          dt.Rows.Add(new object[] {20, DateTime.Parse("2016-10-11"), 2, 10.8}); 
          dt.Rows.Add(new object[] {21, DateTime.Parse("2016-10-12"), 1, 11.1}); 
          dt.Rows.Add(new object[] {22, DateTime.Parse("2016-10-12"), 1, 11.7}); 
          dt.Rows.Add(new object[] {23, DateTime.Parse("2016-10-12"), 1, 11.0}); 
          dt.Rows.Add(new object[] {24, DateTime.Parse("2016-10-12"), 1, 11.4}); 
          dt.Rows.Add(new object[] {25, DateTime.Parse("2016-10-12"), 1, 11.7}); 
          dt.Rows.Add(new object[] {26, DateTime.Parse("2016-10-12"), 1, 11.8}); 
          dt.Rows.Add(new object[] {27, DateTime.Parse("2016-10-12"), 1, 11.1}); 
          dt.Rows.Add(new object[] {28, DateTime.Parse("2016-10-12"), 1, 11.1}); 
          dt.Rows.Add(new object[] {29, DateTime.Parse("2016-10-12"), 1, 11.4}); 
          dt.Rows.Add(new object[] {30, DateTime.Parse("2016-10-12"), 1, 11.6}); 
          dt.Rows.Add(new object[] {31, DateTime.Parse("2016-10-12"), 2, 11.9}); 
          dt.Rows.Add(new object[] {32, DateTime.Parse("2016-10-12"), 2, 11.6}); 
    
          var results = dt.AsEnumerable() 
           .GroupBy(x => new { day = x.Field<DateTime>("Day"), group = x.Field<int>("Group")}) 
           .Select(x => x.Select(y => y.Field<decimal>("Value")).OrderBy(z => z).ToList()).ToList(); 
    
          List<List<decimal>> groups = new List<List<decimal>>(); 
          const int NUM_GROUPS = 2; 
          foreach (var result in results) 
          { 
           int size = result.Count; 
           int groupSize = (int)(size/NUM_GROUPS); //round down 
    
           List<decimal> newGroup = new List<decimal>() { result[0] }; 
           groups.Add(newGroup); 
           for (int groupNum = 0; groupNum < NUM_GROUPS; groupNum++) 
           { 
            newGroup.Add(result.Skip(groupNum * groupSize).Take(groupSize).Max()); 
           } 
          } 
    
    
         } 
        } 
    } 
    
    +0

    [OK]をこの仕事私はこのような何かを得る: [ [1,2,3、....] [1,2,3、....] [1、2、3、... ]] [1,2,3、....] [1,2,3、....] しかし、このバッチをどのように分割して、すべてのバッチに対して最初の値を選択し、最大値を見つけることができますか?この最大値を追加してください。 例 [ [4、6、8、9、10] [2、4、5、8、8] [1、1、6、9、10] [1、2、4、4、 7] [3、3、7、8、10] ] スプリットの場合は、動作するメソッドを使用します。 – Marko

    +0

    どうぞよろしくお願いいたします – jdweng

    +0

    私のコードでどのように見ることができますか私は4つの部分に分割し、すべての部分の最初の値を選択するので、私は4つの値を持っています。それから、私はすべてのグループから4つの値までのConcat Max値を得ます。結局、すべてのグループに対して5つの値があります。この場合、私は毎日のためにグループごとに5つの価値があるはずです。 – Marko

    0

    試してみてください、私は、出力文字列を生成するよりエレガントな方法がなければならないことを確信しているものの

    static void Main(string[] args) 
        { 
         List<Example> samples = new List<Example>(); 
         samples.Add(new Example(1, DateTime.Parse("2016-10-11"), 1, 10.5)); 
         samples.Add(new Example(2, DateTime.Parse("2016-10-11"), 1, 10.8)); 
         samples.Add(new Example(3, DateTime.Parse("2016-10-11"), 2, 10.1)); 
         samples.Add(new Example(4, DateTime.Parse("2016-10-11"), 2, 10.0)); 
         samples.Add(new Example(5, DateTime.Parse("2016-10-12"), 1, 11.1)); 
         samples.Add(new Example(6, DateTime.Parse("2016-10-12"), 1, 11.7)); 
         samples.Add(new Example(7, DateTime.Parse("2016-10-12"), 2, 11.9)); 
         samples.Add(new Example(8, DateTime.Parse("2016-10-12"), 2, 11.6)); 
    
         var daily_results = samples.GroupBy(g => new { g.group, g.date }).GroupBy(g => g.Key.date); 
    
         StringBuilder sb = new StringBuilder(); 
    
         sb.Append("["); 
         foreach (var group_result in daily_results) 
         { 
          sb.Append("["); 
          foreach(var result in group_result) 
          { 
           sb.Append($"[{string.Join(",", result.OrderBy(r => r.value).Select(r => r.value))}]"); 
          } 
          sb.Append("]"); 
         } 
         sb.Append("]"); 
    
         Console.WriteLine(sb); 
         Console.Read(); 
        } 
    } 
    class Example 
    { 
        public int id; 
        public DateTime date; 
        public int group; 
        public double value; 
        public Example(int i, DateTime d, int g, double v) 
        { 
         id = i; 
         date = d; 
         group = g; 
         value = v; 
        } 
    } 
    

    UPDATE:出力コードは次のように簡略化することができます。

     var daily_results = samples.GroupBy(g => new { g.group, g.date }).GroupBy(g => g.Key.date); 
    
         string output = string.Empty; 
    
         daily_results.ToList().ForEach(grp => 
          { 
           output += "["; 
           grp.ToList().ForEach(res => 
           { 
            output += $"[{string.Join(",", res.OrderBy(r => r.value).Select(r => r.value))}],"; 
           }); 
           output = output.TrimEnd(',') + "],"; 
          }); 
         Console.WriteLine($"[{output.TrimEnd(',')}]"); 
         Console.Read();