【问题标题】:Linq - Filter rows based on prior dataLinq - 根据先前数据过滤行
【发布时间】:2018-08-17 15:33:38
【问题描述】:

有一个场景,我要从 oracle 数据库中获取数据。 行的格式为 - Id、Name、Amount、Data-1、Data-2、Date 以及其他列。

表中填充了外部数据,并为每个条目创建了行,因此相同的名称可以有多个条目

对于给定的名称,我只需要在金额更改时选择行。

所以数据可能是:

var data = new []
{
    new { Id = 1, Name = "John", Amount = 1000, Data_1 = 123, Data_2 = 234, Date = new DateTime(2018, 1, 1) },
    new { Id = 2, Name = "John", Amount = 1000, Data_1 = 123, Data_2 = 234, Date = new DateTime(2018, 1, 2) },
    new { Id = 3, Name = "John", Amount = 2000, Data_1 = 123, Data_2 = 234, Date = new DateTime(2018, 1, 3) },
    new { Id = 4, Name = "John", Amount = 2000, Data_1 = 112, Data_2 = 113, Date = new DateTime(2018, 1, 4) },
};

我需要选择 id - 1 和 3。 id-1 是第一行,id-3 是因为金额列值从前一行 id-2 发生变化。

如果我没有正确解释问题,请告诉我。

感谢您的帮助。

【问题讨论】:

    标签: linq


    【解决方案1】:

    你可以这样做:

    var data = new []
    {
        new { Id = 1, Name = "John", Amount = 1000, Data_1 = 123, Data_2 = 234, Date = new DateTime(2018, 1, 1) },
        new { Id = 2, Name = "John", Amount = 1000, Data_1 = 123, Data_2 = 234, Date = new DateTime(2018, 1, 2) },
        new { Id = 3, Name = "John", Amount = 2000, Data_1 = 123, Data_2 = 234, Date = new DateTime(2018, 1, 3) },
        new { Id = 4, Name = "John", Amount = 2000, Data_1 = 112, Data_2 = 113, Date = new DateTime(2018, 1, 4) },
    };
    
    var result = data.Aggregate(data.Take(0).ToList(), (a, x) =>
    {
        if (!a.Any() || a.Last().Amount != x.Amount)
        {
            a.Add(x);
        }
        return a;
    });
    

    产生:

    【讨论】:

    • data.Take(0).ToList() - 获得智能感知的好方法;)
    • @Fabio - 创建匿名类型的空列表也是一种绝妙的技术。
    【解决方案2】:

    按您希望避免选择为重复的列分组,然后选择按 Id 排序的组中的第一项。在你的情况下,我认为是名称,金额

    参考:How to get first record in each group using Linq

    【讨论】:

    • 要求是“我只需要在 Amount 更改时选择行” - 获取每个组的第一个项目不会这样做。
    • 按数量分组并在每组中取第一项不可行吗?如果我正确理解了您的问题。如果你想名字一样,可以重复相同的数量,但你只需要在相同的名字行之间改变数量时才需要选择。这会解决的
    • 但如果金额恢复到 1000,我觉得 OP 会希望返回该记录。
    • @Enigmativity 哦,是的,在这种情况下它不会起作用
    • 然后递归函数跳过直到第一个数量相等,然后从那里对列表进行分区,将列表中的第一个作为新数量并再次调用相同的函数(使用迭代器)。又是一个想法
    猜你喜欢
    • 2018-08-24
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多