如何使用重复值更新元素值?
假设我的列表中有 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
最后,Price
是 not null 最高价:
Price = chunk.Where(item => item.Price.HasValue).Max(item => item.Price.Value)
关于c# - 如何用重复值更新元素值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57039498/