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?
答案 0 :(得分: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();
答案 1 :(得分: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;
}
}