1
var myDic = new SortedDictionary<DateTime,int> () 
                { { new DateTime(0), 0 },
                  { new DateTime(1), 1 },
                  { new DateTime(2), 1 },
                  { new DateTime(3), 0 },
                  { new DateTime(4), 0 },
                  { new DateTime(5), 2 }
                };

これらの項目を次のように (LINQ 要求で) グループ化する方法:

group 1 : 
  startDate: 0, endDate:0, value:0
group 2 : 
  startDate: 1, endDate:2, value:1
group 3 : 
  startDate: 3, endDate:4, value:0
group 4 : 
  startDate: 5, endDate:5, value:2

グループは、連続する日付と同じ値によって定義されます。

groupby で可能ですか?

4

2 に答える 2

2

keyGenerating 関数を使用するだけです。この例では、日付がソース内でギャップなしで既に順序付けられていることを前提としています。

int currentValue = 0;
int groupCounter = 0;

Func<KeyValuePair<DateTime, int>, int> keyGenerator = kvp =>
{
  if (kvp.Value != currentValue)
  {
    groupCounter += 1;
    currentValue = kvp.Value;
  }
  return groupCounter;
}

List<IGrouping<int, KeyValuePair<DateTime, int>> groups =
  myDictionary.GroupBy(keyGenerator).ToList();
于 2012-11-12T20:08:44.750 に答える
1

値の変化に対して連続した日付をグループ化しようとしているようです。グループ化にlinqを使用するべきではないと思います。代わりに、linq を使用して日付を並べ替え、並べ替えられたリストを反復処理してグループを作成する必要があります。

追加 1 を使用してコレクションを構築できる場合があります.Aggregate()。今でもそれは間違ったアプローチだと思います。

あなたのデータは、この関数を として入力する必要がありますSortedDictionaryか? 推測ですが、おそらく年代順に並べられた記録です。

その場合は、次のようにします。

    public class Record
    {
        public DateTime Date { get; set; }
        public int Value { get; set; }
    }

    public class Grouper
    {
        public IEnumerable<IEnumerable<Record>> GroupRecords(IEnumerable<Record> sortedRecords)
        {
            var groupedRecords = new List<List<Record>>();
            var recordGroup = new List<Record>();
            groupedRecords.Add(recordGroup);

            foreach (var record in sortedRecords)
            {
                if (recordGroup.Count > 0 && recordGroup.First().Value != record.Value)
                {
                    recordGroup = new List<Record>();
                    groupedRecords.Add(recordGroup);
                }

                recordGroup.Add(record);
            }

            return groupedRecords;
        }
    }
于 2012-11-12T19:58:34.053 に答える