在Linq中保留订购的同时进行分组

Bas*_*sic 5 .net linq group-by

我有一个IQueryable(Of Job)约伯所在的地方,除其他外:

Property CreatedOn as DateTime
Property JobType as JobTypes

Enum JobTypes
    JobType1
    JobType2
    JobType3
End Enum
Run Code Online (Sandbox Code Playgroud)

我想要摆脱它的是一个列表,按顺序排列CreatedOn,然后按JobType计数分组

比如说我有(缩写日期)

11:00  JobType1
11:01  JobType2
11:02  JobType2
11:03  JobType2
11:04  JobType2
11:05  JobType3
11:06  JobType1
11:07  JobType1
Run Code Online (Sandbox Code Playgroud)

我想要

JobType1 1
JobType2 4
JobType3 1
JobType1 2
Run Code Online (Sandbox Code Playgroud)

我不知道如何在分组时考虑订购.有人能以正确的方式指出我吗?根据喜好,我更喜欢流利的语法.VB.Net或C#很好.

Amy*_*y B 3

这个技巧很容易训练 LinqToObjects 来完成:

public static IEnumerable<IGrouping<TKey, TSource>> GroupContiguous<TKey, TSource>(
  this IEnumerable<TSource> source,
  Func<TSource, TKey> keySelector)
{
  bool firstIteration = true;
  MyCustomGroupImplementation<TKey, TSource> currentGroup = null;

  foreach (TSource item in source)
  {
    TKey key = keySelector(item);
    if (firstIteration)
    {
      currentGroup = new MyCustomGroupImplementation<TKey, TSource>();
      currentGroup.Key = key;
      firstIteration = false;
    }
    else if (!key.Equals(currentGroup.Key))
    {
      yield return currentGroup;
      currentGroup = new MyCustomGroupImplementation<TKey, TSource>();
      currentGroup.Key = key;
    }
    currentGroup.Add(item);
  }
  if (currentGroup != null)
  {
    yield return currentGroup;
  }
}

public class MyCustomGroupImplementation<TKey, TSource> : IGrouping<TKey, TSource>
{
  //TODO implement IGrouping and Add
}
Run Code Online (Sandbox Code Playgroud)

使用者

IEnumerable<IGrouping<JobType, Job> query = Jobs
  .OrderBy(j => j.CreatedOn)
  .GroupContiguous(j => j.JobType);
Run Code Online (Sandbox Code Playgroud)

使用任何旧的 linq 提供程序来“查看前一行”并不是那么容易。我希望您不必教 LinqToSql 或 LinqToEntities 如何执行此操作。

  • ... 嗯.. 我想我真的是在问“你为什么不将源代码发布到 MyCustomGroupImplementation?” (2认同)