gpt4 book ai didi

linq - 如何将此逻辑转换为 LINQ 语句?

转载 作者:行者123 更新时间:2023-12-04 06:52:25 24 4
gpt4 key购买 nike

我无法将这一点逻辑转换为 Linq 语句,这让我发疯。我有一个包含类别和 createdondate 字段的项目列表。我想按类别分组,只返回具有其类别最大日期的项目。

例如,列表包含类别 1 和 2 的项目。第一天 (1/1) 我将两个项目同时发布到类别 1 和 2。第二天 (1/2) 我将三个项目发布到类别 1。 list 应将第二天的帖子返回到类别 1,将第一天的帖子返回到类别 2。

现在我将它按类别分组,然后通过 foreach 循环运行以将组中的每个项目与组的最大日期进行比较,如果日期小于它删除项目的最大日期。

必须有一种方法可以消除循环,但我还没有弄清楚!

最佳答案

你可以这样做:

    from item in list
group item by item.Category into g
select g.OrderByDescending(it => it.CreationDate).First();

但是,它不是很有效,因为它需要对每个组的项目进行排序,这比必要的要复杂(您实际上不需要排序,您只需要扫描列表一次)。所以我创建了这个扩展方法来查找具有属性(或函数)最大值的项目:
    public static T WithMax<T, TValue>(this IEnumerable<T> source, Func<T, TValue> selector)
{
var max = default(TValue);
var withMax = default(T);
var comparer = Comparer<TValue>.Default;
bool first = true;
foreach (var item in source)
{
var value = selector(item);
int compare = comparer.Compare(value, max);

if (compare > 0 || first)
{
max = value;
withMax = item;
}
first = false;
}
return withMax;
}

您可以按如下方式使用它:
    from item in list
group item by item.Category into g
select g.WithMax(it => it.CreationDate);

更新:正如安东尼在他的评论中指出的那样,这段代码并没有完全回答这个问题......如果你想要所有日期是其类别最大值的项目,你可以做这样的事情:
    from item in list
group item by item.Category into g
let maxDate = g.Max(it => it.CreationDate)
select new
{
Category = g.Key,
Items = g.Where(it => it.CreationDate == maxDate)
};

关于linq - 如何将此逻辑转换为 LINQ 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2936586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com