使用(单个)LINQ 查询计算与组中前一项的差异

2023-12-25

当数据需要分组时,我试图弄清楚如何计算与前一项的差异。

我有这样的数据

City      Area  Date        Citizens
New York    1   2010.11.20  5
New York    1   2010.11.21  8
New York    1   2010.11.22  12
New York    1   2010.11.23  17
New York    1   2010.11.24  23
New York    1   2010.11.25  29

Chicago 1   2010.11.20  5
Chicago 1   2010.11.21  10
Chicago 1   2010.11.22  15
Chicago 1   2010.11.23  20
Chicago 1   2010.11.24  25
Chicago 1   2010.11.25  30

New York    2   2010.11.20  6
New York    2   2010.11.21  7
New York    2   2010.11.22  9
New York    2   2010.11.23  7
New York    2   2010.11.24  10
New York    2   2010.11.25  15

Chicago 2   2010.11.20  5
Chicago 2   2010.11.21  15
Chicago 2   2010.11.22  25
Chicago 2   2010.11.23  20
Chicago 2   2010.11.24  25
Chicago 2   2010.11.25  30

我需要为每个城市添加一列“增加”,其计算方法是从当前公民数量中减去以前的公民数量。

The expected result is like this

City    Area    Date    Citizens    Increase
New York    1   2010.11.20  5   5
New York    1   2010.11.21  8   3
New York    1   2010.11.22  12  4
New York    1   2010.11.23  17  5
New York    1   2010.11.24  23  6
New York    1   2010.11.25  29  7

Chicago 1   2010.11.20  5   5
Chicago 1   2010.11.21  10  5
Chicago 1   2010.11.22  15  5
Chicago 1   2010.11.23  20  5
Chicago 1   2010.11.24  25  5
Chicago 1   2010.11.25  30  5

New York    2   2010.11.20  6   6
New York    2   2010.11.21  7   1
New York    2   2010.11.22  9   2
New York    2   2010.11.23  7   -2
New York    2   2010.11.24  10  3
New York    2   2010.11.25  15  5

Chicago 2   2010.11.20  5   5
Chicago 2   2010.11.21  15  10
Chicago 2   2010.11.22  25  10
Chicago 2   2010.11.23  20  -5
Chicago 2   2010.11.24  25  5
Chicago 2   2010.11.25  30  5

我想知道这是否可以通过单个 linq 查询来完成,从而避免 “foreach(城市中的 c) foreach(区域内的a) ……”

问题是如何计算“7”行,其中与先前记录的简单差异将为 -24,而此时应该为 5。

这是一个示例代码:

using System;
using System.Collections.Generic;

namespace ConsoleApplication1
{
    public class MyObject
    {
        public int ID { get; set; }
        public string City { get;set; }
        public DateTime Date { get; set; }
        public int Value { get; set; }
        public int DiffToPrev { get; set; }
    }

    class Program
    {

        static void Main()
        {
            var list = new List<MyObject>
              {
                new MyObject {ID= 1, City = "New York",Date = DateTime.Now,          Value = 5},
                new MyObject {ID= 1, City = "New York",Date = DateTime.Now.AddDays(1),Value = 8},
                new MyObject {ID= 1, City = "New York",Date = DateTime.Now.AddDays(2),Value = 12},
                new MyObject {ID= 1, City = "New York",Date = DateTime.Now.AddDays(3),Value = 17},
                new MyObject {ID= 1, City = "New York",Date = DateTime.Now.AddDays(4),Value = 23},
                new MyObject {ID= 1, City = "New York",Date = DateTime.Now.AddDays(5),Value = 29},

                new MyObject {ID= 1, City = "Chicago",Date = DateTime.Now,           Value = 5},
                new MyObject {ID= 1, City = "Chicago",Date = DateTime.Now.AddDays(1),Value = 10},
                new MyObject {ID= 1, City = "Chicago",Date = DateTime.Now.AddDays(2),Value = 15},
                new MyObject {ID= 1, City = "Chicago",Date = DateTime.Now.AddDays(3),Value = 20},
                new MyObject {ID= 1, City = "Chicago",Date = DateTime.Now.AddDays(4),Value = 25},
                new MyObject {ID= 1, City = "Chicago",Date = DateTime.Now.AddDays(5),Value = 30},

                new MyObject {ID= 2, City = "New York",Date = DateTime.Now,          Value = 6},
                new MyObject {ID= 2, City = "New York",Date = DateTime.Now.AddDays(1),Value = 7},
                new MyObject {ID= 2, City = "New York",Date = DateTime.Now.AddDays(2),Value = 9},
                new MyObject {ID= 2, City = "New York",Date = DateTime.Now.AddDays(3),Value = 7},
                new MyObject {ID= 2, City = "New York",Date = DateTime.Now.AddDays(4),Value = 10},
                new MyObject {ID= 2, City = "New York",Date = DateTime.Now.AddDays(5),Value = 15},

                new MyObject {ID= 2, City = "Chicago",Date = DateTime.Now,           Value = 5},
                new MyObject {ID= 2, City = "Chicago",Date = DateTime.Now.AddDays(1),Value = 15},
                new MyObject {ID= 2, City = "Chicago",Date = DateTime.Now.AddDays(2),Value = 25},
                new MyObject {ID= 2, City = "Chicago",Date = DateTime.Now.AddDays(3),Value = 20},
                new MyObject {ID= 2, City = "Chicago",Date = DateTime.Now.AddDays(4),Value = 25},
                new MyObject {ID= 2, City = "Chicago",Date = DateTime.Now.AddDays(5),Value = 30},               
            };

        }
    }
}

你可以这样做:

var newList = list.GroupBy(x => new { x.City, x.ID })
.Select
(
    x =>
    {
        var subList = x.OrderBy(y => y.Date).ToList();
        return subList.Select((y, idx) => new MyObject
        {
            ID = y.ID,
            City = y.City,
            Date = y.Date,
            Value = y.Value,
            DiffToPrev = (idx == 0) ? y.Value : y.Value - subList.ElementAt(idx-1).Value 
        });
    }
)
.SelectMany(x => x)
.ToList();

无论如何,我认为在这种情况下 foreach 语句更清晰(而且不是更长),例如:

List<MyObject> newList = new List<MyObject>();
foreach (var grp in list.GroupBy(x => new { x.City, x.ID }))
{
    MyObject prev = null;
    foreach (var obj in grp.OrderBy(y => y.Date))
    {
        newList.Add(new MyObject
        {
            ID = obj.ID,
            City = obj.City,
            Date = obj.Date,
            Value = obj.Value,
            DiffToPrev = (prev == null) ? obj.Value : obj.Value - prev.Value
        });
        prev = obj;
    }
}

P.S.
显然(根据您的需要)在 foreach 代码中您可以设置DiffToPrev直接在现有对象上(obj)而不是创建一个新的,而是使创建成为可选newList.


Results:

ID: 1,City: New York,Date: 21/11/2010 12:52:40,Value: 5,Diff: 5
ID: 1,City: New York,Date: 22/11/2010 12:52:40,Value: 8,Diff: 3
ID: 1,City: New York,Date: 23/11/2010 12:52:40,Value: 12,Diff: 4
ID: 1,City: New York,Date: 24/11/2010 12:52:40,Value: 17,Diff: 5
ID: 1,City: New York,Date: 25/11/2010 12:52:40,Value: 23,Diff: 6
ID: 1,City: New York,Date: 26/11/2010 12:52:40,Value: 29,Diff: 6
ID: 1,City: Chicago,Date: 21/11/2010 12:52:40,Value: 5,Diff: 5
ID: 1,City: Chicago,Date: 22/11/2010 12:52:40,Value: 10,Diff: 5
ID: 1,City: Chicago,Date: 23/11/2010 12:52:40,Value: 15,Diff: 5
ID: 1,City: Chicago,Date: 24/11/2010 12:52:40,Value: 20,Diff: 5
ID: 1,City: Chicago,Date: 25/11/2010 12:52:40,Value: 25,Diff: 5
ID: 1,City: Chicago,Date: 26/11/2010 12:52:40,Value: 30,Diff: 5
ID: 2,City: New York,Date: 21/11/2010 12:52:40,Value: 6,Diff: 6
ID: 2,City: New York,Date: 22/11/2010 12:52:40,Value: 7,Diff: 1
ID: 2,City: New York,Date: 23/11/2010 12:52:40,Value: 9,Diff: 2
ID: 2,City: New York,Date: 24/11/2010 12:52:40,Value: 7,Diff: -2
ID: 2,City: New York,Date: 25/11/2010 12:52:40,Value: 10,Diff: 3
ID: 2,City: New York,Date: 26/11/2010 12:52:40,Value: 15,Diff: 5
ID: 2,City: Chicago,Date: 21/11/2010 12:52:40,Value: 5,Diff: 5
ID: 2,City: Chicago,Date: 22/11/2010 12:52:40,Value: 15,Diff: 10
ID: 2,City: Chicago,Date: 23/11/2010 12:52:40,Value: 25,Diff: 10
ID: 2,City: Chicago,Date: 24/11/2010 12:52:40,Value: 20,Diff: -5
ID: 2,City: Chicago,Date: 25/11/2010 12:52:40,Value: 25,Diff: 5
ID: 2,City: Chicago,Date: 26/11/2010 12:52:40,Value: 30,Diff: 5
ID: 1,City: New York,Date: 21/11/2010 12:52:40,Value: 5,Diff: 5
ID: 1,City: New York,Date: 22/11/2010 12:52:40,Value: 8,Diff: 3
ID: 1,City: New York,Date: 23/11/2010 12:52:40,Value: 12,Diff: 4
ID: 1,City: New York,Date: 24/11/2010 12:52:40,Value: 17,Diff: 5
ID: 1,City: New York,Date: 25/11/2010 12:52:40,Value: 23,Diff: 6
ID: 1,City: New York,Date: 26/11/2010 12:52:40,Value: 29,Diff: 6
ID: 1,City: Chicago,Date: 21/11/2010 12:52:40,Value: 5,Diff: 5
ID: 1,City: Chicago,Date: 22/11/2010 12:52:40,Value: 10,Diff: 5
ID: 1,City: Chicago,Date: 23/11/2010 12:52:40,Value: 15,Diff: 5
ID: 1,City: Chicago,Date: 24/11/2010 12:52:40,Value: 20,Diff: 5
ID: 1,City: Chicago,Date: 25/11/2010 12:52:40,Value: 25,Diff: 5
ID: 1,City: Chicago,Date: 26/11/2010 12:52:40,Value: 30,Diff: 5
ID: 2,City: New York,Date: 21/11/2010 12:52:40,Value: 6,Diff: 6
ID: 2,City: New York,Date: 22/11/2010 12:52:40,Value: 7,Diff: 1
ID: 2,City: New York,Date: 23/11/2010 12:52:40,Value: 9,Diff: 2
ID: 2,City: New York,Date: 24/11/2010 12:52:40,Value: 7,Diff: -2
ID: 2,City: New York,Date: 25/11/2010 12:52:40,Value: 10,Diff: 3
ID: 2,City: New York,Date: 26/11/2010 12:52:40,Value: 15,Diff: 5
ID: 2,City: Chicago,Date: 21/11/2010 12:52:40,Value: 5,Diff: 5
ID: 2,City: Chicago,Date: 22/11/2010 12:52:40,Value: 15,Diff: 10
ID: 2,City: Chicago,Date: 23/11/2010 12:52:40,Value: 25,Diff: 10
ID: 2,City: Chicago,Date: 24/11/2010 12:52:40,Value: 20,Diff: -5
ID: 2,City: Chicago,Date: 25/11/2010 12:52:40,Value: 25,Diff: 5
ID: 2,City: Chicago,Date: 26/11/2010 12:52:40,Value: 30,Diff: 5
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用(单个)LINQ 查询计算与组中前一项的差异 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Python 中的字符串反转

    我接受了一个整数输入并尝试在 Python 中反转它 但徒劳 我把它改成了字符串 但仍然不能 有什么办法可以逆转吗 有没有内置的功能 我无法将整数转换为列表 因此无法应用反向函数 您可以使用切片运算符来反转字符串 s hello world
  • nginx proxy_pass 通过 https_proxy

    我正在尝试使用此配置设置 nginx 要访问 backend mygreat server com 我必须通过我的公司代理 即 myproxy server com 80 因此 我将其添加到 etc environment 中 https
  • 如何获取最新的 Chrome(版本 55)以允许混合内容?

    我有一个 chrome 扩展 它在开发中使用 HTTP 进行通信 在生产中使用 HTTPS 进行通信 我从使用 HTTPS 的网页运行它 当我在开发模式下使用此扩展时 出现以下错误 混合内容 页面位于 https somesite com
  • FFmpeg 将 .mp3 输出保存到变量中

    在我的应用程序中 我想修改各种mp3 然后将它们混合在一起 我知道我可以在 FFmpeg 中使用单个命令行来完成此操作 但它最终可能会非常混乱 因为我需要在每个样本上使用各种过滤器 而我有五个过滤器 我的想法是单独编辑每个样本 将它们保存到
  • LDAP 服务器不可用

    我对此完全是新手 尝试连接到 LDAP 服务器PrincipalContext 我已经尝试了该网站上的所有解决方案 但均无济于事 我尝试过的事情 PrincipalContext insPrincipalContext new Princi
  • 更好的过滤集合模式

    我有一个名为Games我希望用户使用复选框来过滤集合 每次选中 取消选中复选框时 都会调用流星订阅来显示相应的内容Games 以下是订阅的示例 不是正确的 mongo 代码 region east west eu skill casual
  • YAJSW窗口服务未启动

    我有一个 Java 应用程序 我希望它作为窗口服务运行 为此我选择了 YAJSW 我已经使用我的 Java 进程 ID 运行了 GetConfig bat 并且它已生成配置文件 我已将用户名和密码放入配置文件中并运行 runConsole
  • R XTS to.mines5(),未按“I”预期进行转换

    您好 我正在将一些 1 分钟的数据转换为 5 分钟的数据 我发现第一次增量需要 4 分钟 然后继续执行 5 分钟的增量 我尝试过使用所有 indexAt 参数 但没有一个给我想要的 从 5 开始 然后是 10 15 20 等 我试过了 x5
  • 在2.0.0M1中安装Grails Spock插件

    我正在尝试 Grails 2 0 0M1 和 Springsource Tool Suite 2 7 1 但在安装 spock 插件时遇到问题 当我运行 grails install plugin spock 0 6 groovy 1 8
  • 如何在 Android 市场中从免费应用程序链接到付费应用程序?

    如果我在 Android 市场上有付费应用程序的免费版本 如何在免费应用程序中放置一个按钮来打开市场中的付费版本 更好的是使用 market details 而不是 market search Intent intent new Inten
  • 模拟器网络IP地址和虚拟路由器

    我在 Windows 上使用 Android 模拟器 Android 开发人员文档表示 模拟器的每个实例都在虚拟路由器 防火墙服务后面运行 每个实例的虚拟路由器管理 10 0 2 24 网络地址空间 但是 当我使用以下命令连接到模拟器时ad
  • 如何检查程序空闲时间而不是系统空闲时间?

    我有一个程序 偶尔需要递归地扫描一些目录 这部分程序的改进正在酝酿中 但暂时还没有准备好 为了避免用户必须等待此扫描 我希望尽可能在用户不使用我的程序时进行扫描 我打算通过运行一个检查空闲时间的计时器来实现它 我发现以下内容用于检查系统空闲
  • 带有递归的字符串排列

    我是一名java初学者 正在尝试从java编程书中进行字符串排列练习 我定义了两种方法 public static void displayPermutation String s public static void displayPer
  • 预留座位软件:C#即时抽取大量座位

    我正在使用 C 构建座位预订软件 但我很困惑如何立即抽取大量座位 我正在尝试三种方法 即 使用用户控件 public void DrawUsercontrol int x int y int space 4 int SeatLimit 16
  • 添加动态/通配符 FACEBOOK 有效的 OAuth 重定向 URI [重复]

    这个问题在这里已经有答案了 我希望能够在不同的子域上登录 Facebook 例如 www 123 mywebsite com www 456 mywebsite com 有办法实现这一点吗 而不是手动将它们一一添加 也许像通配符 例如 ww
  • 在文件中搜索多个字符串(来自文件)并打印该行

    再次为这里的菜鸟道歉 尝试下面的代码来搜索从关键字读取的多个字符串并搜索f并打印该行 如果我只有一个关键字 它会起作用 但如果我有多个关键字 它就不起作用 keywords input Please Enter keywords path
  • 从url下载文件,保存到手机存储

    我正在开发一个项目 该项目需要我在点击按钮后从 URL 下载文件 并将其存储到手机存储 可能是下载文件夹 关于如何做到这一点有什么想法吗 正在下载的文件也不总是相同的 可以是从图像到 pdf 的任何文件 Use https pub dart
  • 字符大小是 8 位还是 16 位?

    http docs oracle com javase tutorial java nutsandbolts datatypes html http docs oracle com javase tutorial java nutsandb
  • 在oracle中如何将xml转换为json?

    如果我有
  • 使用(单个)LINQ 查询计算与组中前一项的差异

    当数据需要分组时 我试图弄清楚如何计算与前一项的差异 我有这样的数据 City Area Date Citizens New York 1 2010 11 20 5 New York 1 2010 11 21 8 New York 1 20