Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按相同值和连续日期分组_C#_Linq_Linq Group - Fatal编程技术网

C# 按相同值和连续日期分组

C# 按相同值和连续日期分组,c#,linq,linq-group,C#,Linq,Linq Group,组由连续的日期和相同的值定义 是否可以使用groupby?看起来您正试图根据值的变化对连续日期进行分组。我认为您不应该使用linq进行分组。相反,您应该使用linq对日期进行排序,并迭代排序后的列表来创建组 添加1 虽然您可以使用.Aggregate()构建集合。我仍然认为这是错误的做法 您的数据是否必须以SortedDictionary的形式输入此函数? 我只是猜测,但这些可能是按时间顺序排列的记录 如果是,请执行以下操作: group 1 : startDate: 0, endDate

组由连续的日期和相同的值定义


是否可以使用groupby?

看起来您正试图根据值的变化对连续日期进行分组。我认为您不应该使用linq进行分组。相反,您应该使用linq对日期进行排序,并迭代排序后的列表来创建组

添加1 虽然您可以使用
.Aggregate()
构建集合。我仍然认为这是错误的做法

您的数据是否必须以
SortedDictionary
的形式输入此函数? 我只是猜测,但这些可能是按时间顺序排列的记录

如果是,请执行以下操作:

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
公共类记录
{
公共日期时间日期{get;set;}
公共int值{get;set;}
}
公共级石斑鱼
{
公共IEnumerable组记录(IEnumerable sortedRecords)
{
var groupedRecords=新列表();
var recordGroup=新列表();
groupedRecords.Add(记录组);
foreach(分拣记录中的var记录)
{
if(recordGroup.Count>0&&recordGroup.First().Value!=record.Value)
{
记录组=新列表();
groupedRecords.Add(记录组);
}
记录组。添加(记录);
}
返回分组记录;
}
}

只需使用一个键生成函数。此示例假定您的日期已在源中排序,没有间隔

    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;
        }
    }
int currentValue=0;
int-groupCounter=0;
Func keyGenerator=kvp=>
{
如果(kvp.Value!=当前值)
{
groupCounter+=1;
currentValue=kvp.值;
}
返回组计数器;
}

ListSo不能使用GroupBy linq请求吗?使用TakeWhile是否可能?您可能可以使用Aggregate()执行某些操作,但我认为这是错误的方法。我正在编辑我的帖子。请参阅添加内容。一般来说,LINQ要么对整个列表进行操作,要么对其中的一个元素进行操作。你要求它根据周围的情况采取行动,但不是整个清单,这不是它擅长的。
    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;
        }
    }
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();