c# - 如何用重复值更新元素值?

标签 c# linq

如何使用重复值更新元素值?

假设我的列表中有 4 个元素,如您所见,有 Dog1 和 Dog2 元素:

Name: Dog1 Price: NULL Age: 14 ImportDate = 14.07.2019 15:00

Name: Dog1 Price: NULL Age: 17 ImportDate = 14.07.2019 14:00

Name: Dog1 Price: 14.00 Age = 13 ImportDate = 14.07.2019 13:00

Name: Dog2 Price: NULL Age: 14 ImportDate = 14.07.2019 16:00

Name: Dog2 Price: NULL Age: 17 ImportDate = 14.07.2019 10:00

Name: Dog2 Price: 22.00 Age = 13 ImportDate = 14.07.2019 09:00

在列表中的这些元素中,我只想保留具有最新 ImportDate 的狗,我还想保留列表中的这两个元素:

Name: Dog1 Price: NULL Age: 14 ImportDate = 14.07.2019 15:00

Name: Dog2 Price: NULL Age: 14 ImportDate = 14.07.2019 16:00

在我提供的代码行下,将这两只狗保留在列表中并删除其余的。

    dogList
      .GroupBy(x => new { 
         x.Name, 
         x.ImportDate.Date 
       })
      .Select(g => g
         .OrderByDescending(x => x.ImportDate)
         .First())
      .ToList();

但是我保留在列表中的两只狗没有任何价格。 我想要做的是为这些值(value)为 NULL 的狗设置价格,使其在特定日期具有价格的现有狗的价格,在这种情况下,最新的 dog1 应该有 14:00 的价格,dog2 应该有价格 22。

我怎样才能做到这一点? 我想我需要从列表中找到元素,然后找到给定名称和导入日期的狗的价格。然后用结算更新列表中的元素

更新列表中的值后,结果应如下所示:

Name: Dog1 Price: 14.00 Age: 14 ImportDate = 14.07.2019 15:00

Name: Dog1 Price: 14.00 Age: 17 ImportDate = 14.07.2019 14:00

Name: Dog1 Price: 14.00 Age = 13 ImportDate = 14.07.2019 13:00

Name: Dog2 Price: 22.00 Age: 14 ImportDate = 14.07.2019 16:00

Name: Dog2 Price: 22.00 Age: 17 ImportDate = 14.07.2019 10:00

Name: Dog2 Price: 22.00 Age = 13 ImportDate = 14.07.2019 09:00

最终结果应该是一个包含这些元素的列表:

Name: Dog1 Price: 14.00 Age: 14 ImportDate = 14.07.2019 15:00

Name: Dog2 Price: 22.00 Age: 14 ImportDate = 14.07.2019 16:00

最佳答案

我建议从每个组中创建 Dog 实例:

var filtered = dogList
  .GroupBy((item => new { 
     item.Name, 
     item.ImportDate.Date 
   })
  .Select(chunk => new Dog() { //TODO: Use the right syntax here
     Name       = chunk.Key.Name,
     ImportDate = chunk.Max(item => item.ImportDate), 
     Age        = chunk
       .Aggregate((s, a) => s.ImportDate < a.ImportDate ? s : a)
       .Age,  
     Price      = chunk.Where(item => item.Price.HasValue).Max(item => item.Price.Value)
   })
  .ToList();

编辑: 主要原则(创建新的 Dog 实例)保持不变,我们可能想更改最后的 Select 中的一些评估>:

Name - block 的名称:

   Name = chunk.Key.Name

ImportDate - 最大可能:

   ImportDate = chunk.Max(item => item.ImportDate), 

Age - 对应于 ImportDate 的年龄。在这里,我们必须计算 ArgMax(或 MaxBy),这在标准 Linq未预设(在 MoreLinq);但可以用 Aggregate

模拟
     Age = chunk
       .Aggregate((s, a) => s.ImportDate < a.ImportDate ? s : a)
       .Age

最后,Pricenot null 最高价:

     Price = chunk.Where(item => item.Price.HasValue).Max(item => item.Price.Value)

关于c# - 如何用重复值更新元素值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57039498/

相关文章:

c# - 如何订购应用程序设置

c# - 初始化 Entity Framework 数据库时出错序列不包含匹配元素

c# - 使用 LINQ 时从字符串访问 lambda 表达式中的属性

javascript - 应用程序中所有语言的名称大小写约定

javascript - Linq 仅在 Internet Explorer 中创建错误

c# - LINQ Group by 并具有 where 子句

c# - 你如何在C#中模拟鼠标点击?

c# - 如何从列表中取出每个元素并将其插入堆栈?

c# - 如何创建一个空的 IOrderedEnumerable<DynamicNode> 和 IEnumerable<IGrouping<string, DynamicNode>>

c# - C# 中的类和模块是什么