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#很好.
这个技巧很容易训练 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 如何执行此操作。
归档时间: |
|
查看次数: |
1018 次 |
最近记录: |