首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于任意方法查找连续行以分组

基于任意方法查找连续行以分组
EN

Stack Overflow用户
提问于 2016-04-06 02:06:31
回答 1查看 181关注 0票数 0

我需要基于3列对列表(实际上是一个数据表,但为了简单起见)进行分组,在第一列中,以整数形式表示一个财政年度。我需要对所有行进行分组,其中:

  1. 本财政年度的第二栏(服务)等于1和
  2. 下一个财政年度等于1,任何连续的财政年度都有1作为服务

最终结果组将合并所有连续的财政年度,其中有1作为服务,通过采取第一年开始到最后一年结束,同时总结服务和收入。

代码语言:javascript
运行
复制
var list = new List(){
{20002001, 1 , 100.00},
{20012002, .5  , 100.00},
{20022003, 1.0 , 100.00},
{20042005, 1.0 , 50.00},
{20052006, 1.0 , 50.00
};

应产生以下结果:

代码语言:javascript
运行
复制
20002001, 1 , 100.00
20012002, 1 , 100.00
20022006, 3 , 200.00

这不是一个可以理解的例子,但也许它能说明我正在努力做些什么:

代码语言:javascript
运行
复制
var test = from r in list
           where r.Item("FiscalYear") + 10001 = list.SkipWhile(r2 => !r.Equals(current)).Skip(1).FirstOrDefault(r3 => r3.Item("FiscalYear")) &&
                 r.Item("Service") = 1 &&
                 list.SkipWhile(r2 => !r.Equals(current)).Skip(1).FirstOrDefault(r => r.Item("Service") = 1D) 
           Select New { FiscalYear = $"{r.Item("FiscalYear") % 1000}{I have NO IDEA HOW TO DETERMINE THIS PART}", Service = list.Sum(r => r.Item("FiscalYear"), Earnings = list.Sum(r => r.Item("Earnings"))

假设get next将在http://www.herlitz.nu/2011/12/01/getting-the-previous-and-next-record-from-list-using-linq/中工作。但在我的风景里不起作用。

我已经考虑了一个我可以做的小组,除非我会错过正确的计数,将财政年度分组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-06 03:20:27

使用GroupAdjacent by函数(在https://stackoverflow.com/a/4682163/6137718中描述):

代码语言:javascript
运行
复制
public static class LinqExtensions
{
    public static IEnumerable<IEnumerable<T>> GroupAdjacentBy<T>(
        this IEnumerable<T> source, Func<T, T, bool> predicate)
    {
        using (var e = source.GetEnumerator())
        {
            if (e.MoveNext())
            {
                var list = new List<T> { e.Current };
                var pred = e.Current;
                while (e.MoveNext())
                {
                    if (predicate(pred, e.Current))
                    {
                        list.Add(e.Current);
                    }
                    else
                    {
                        yield return list;
                        list = new List<T> { e.Current };
                    }
                    pred = e.Current;
                }
                yield return list;
            }
        }
    }
}

你想要的结果可以这样得到。请注意,我在一年中使用字符串,但如果需要,这可以更改为使用int。使用以下类结构:

代码语言:javascript
运行
复制
    class Entry
{
    public Entry(string year, double service, double earnings)
    {
        this.Year = year;
        this.Service = service;
        this.Earnings = earnings;
    }

    public string Year;
    public double Service;
    public double Earnings;
}

你可以通过做这样的事情得到你想要的结果:

代码语言:javascript
运行
复制
var result = list.GroupAdjacentBy((x, y) => x.Service == 1 && y.Service == 1).
        Select(g => new Entry(
            g.First().Year.Substring(0,4) + g.Last().Year.Substring(4,4),
            g.Sum(e => e.Service),
            g.Sum(e => e.Earnings)));

我的代码的一个例子可以在https://dotnetfiddle.net/RqmYa9上找到。

我不知道为什么在您的示例结果中,第二个条目有1 for Service,而不是0.5。如果希望所有服务至少为一个服务,则在选择服务和时,可以在查询中执行三进制操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36440203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档