我写一个麻烦的查询.我现在正在写一些令人讨厌的循环来解决它,但我很想知道Linq是否可以为我做这件事.
我有:
struct TheStruct
{
public DateTime date {get; set;} //(time portion will always be 12 am)
public decimal A {get; set;}
public decimal B {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
以及包含这些结构的列表.让我们说它是这样订购的:
List<TheStruct> orderedList = unorderedList.OrderBy(x => x.date).ToList();
Run Code Online (Sandbox Code Playgroud)
如果你将orderedList结构日期放在一个集合中,它们将始终与日期相连.即如果列表中的最新日期是2011/01/31,并且列表中最早的日期是2011/01/01,然后你会发现该列表将包含31个项目,一个用于1月份的每个日期.
好的,我想要做的是将列表项分组,以便:
任何Linq大师都知道如何做到这一点?
谢谢!
您可以使用GroupAdjacent扩展方法对序列中的相邻项进行分组(请参见下文):
var result = unorderedList
.OrderBy(x => x.date)
.GroupAdjacent((g, x) => x.A == g.Last().A &&
x.B == g.Last().B &&
x.date == g.Last().date.AddDays(1))
.ToList();
Run Code Online (Sandbox Code Playgroud)
例:
(1,1) 2011-01-01 \
(1,1) 2011-01-02 > Group 1
(1,1) 2011-01-03 __/
(2,1) 2011-01-04 \
(2,1) 2011-01-05 > Group 2
(2,1) 2011-01-06 __/
(1,1) 2011-01-07 \
(1,1) 2011-01-08 > Group 3
(1,1) 2011-01-09 __/
(1,1) 2011-02-01 \
(1,1) 2011-02-02 > Group 4
(1,1) 2011-02-03 __/
Run Code Online (Sandbox Code Playgroud)
扩展方法:
static IEnumerable<IEnumerable<T>> GroupAdjacent<T>(
this IEnumerable<T> source, Func<IEnumerable<T>, T, bool> adjacent)
{
var g = new List<T>();
foreach (var x in source)
{
if (g.Count != 0 && !adjacent(g, x))
{
yield return g;
g = new List<T>();
}
g.Add(x);
}
yield return g;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |