C# LINQ GroupBy将其转换为一个新对象

C# LINQ GroupBy将其转换为一个新对象,c#,linq,C#,Linq,我们正在研究一些LINQ的东西,并且对于使用GroupBy扩展是新的 我正在编辑这篇文章以包含我的实际代码,因为我试图使用一些简单的示例,但它似乎使那些试图帮助的人更加困惑。对不起 注意,我们需要对下面的金额字段求和。我们还没有尝试这样做,因为我们只是想弄清楚如何从groupBy中提取列表 这是我的密码: myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID).GroupBy(g => g.ter

我们正在研究一些LINQ的东西,并且对于使用GroupBy扩展是新的

我正在编辑这篇文章以包含我的实际代码,因为我试图使用一些简单的示例,但它似乎使那些试图帮助的人更加困惑。对不起

注意,我们需要对下面的金额字段求和。我们还没有尝试这样做,因为我们只是想弄清楚如何从groupBy中提取列表

这是我的密码:

myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID).GroupBy(g => g.termLength, o => new Model.MyCSTotal2
                            {
                                PriceinfoID = o.priceinfoId,
                                BillcodeID = o.billcodeid,
                                JobTypeID = o.jobtypeID,
                                SaleTypeID = o.saletypeID,
                                RegratesID = o.regratesID,
                                NatAccPerc = o.natAcctPerc,
                                NatIgnInCommCalc = o.natIgnInCommCalc,
                                TermLength = (int)o.termLength,
                                Amount = o.RMR1YrTotal / 12,
                                RuleEvaluation = 0
                            }).Select(grp => grp.ToList()));
尝试执行此操作时出现的错误是:

参数1:无法从转换 从IEnumerable到IEnumerable

编辑:谢谢你的帮助。以下是我们的结论:

myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID)
                                .GroupBy(g => g.termLength)
                                .SelectMany(cl => cl.Select( o => new Model.MyCSTotal2
                            {
                                PriceinfoID = o.priceinfoId,
                                BillcodeID = o.billcodeid,
                                JobTypeID = o.jobtypeID,
                                SaleTypeID = o.saletypeID,
                                RegratesID = o.regratesID,
                                NatAccPerc = o.natAcctPerc,
                                NatIgnInCommCalc = o.natIgnInCommCalc,
                                TermLength = (int)o.termLength,
                                Amount = cl.Sum(m=>m.RMR1YrTotal / 12),
                                RuleEvaluation = 0
                            })));

我认为没有理由使用GroupBy,因为它不涉及聚合函数。如果你想用术语长度区分人。写一篇与众不同的文章。通过这种方式,您将获得所需的收藏

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
    {
        HashSet<TKey> seenKeys = new HashSet<TKey>();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }

要展平组,您需要使用SelectMany扩展方法:

SelectMany(grp => grp.ToList())
但如果这是您不需要分组的当前查询,则需要使用“选择”:


但是,如果您以后需要展平列表,组的意义是什么?枚举列表和泛型列表是什么,它们有什么区别?代码的哪一部分似乎返回了一个泛型列表?你为什么不确定它回来了?结果期望值是什么意思?@melegant,但您没有使用组来应用聚合函数,能否更具体地说明您期望的结果是什么?我们收到一个错误-请与我们共享错误的全文。@melegant,您正在查看的是SelectMany ext.method:SelectManygrp=>grp.ToList您是对的。实际上,我们需要对“金额”字段求和。我还没有在代码中添加这一点,因为我们只是想解决从groupBy中提取所需列表的问题。我将编辑我的帖子。虽然distinctBy在另一方面对我们很有用。@melegant,问题是,您正在将列表列表传递到AddRange方法中。从每组中,您将收到一份人员列表,然后您将选择该列表,从而生成一份人员列表。正如octavioccl编写的那样,使用SelectMany代替。它会将列表聚合为一个列表,请参阅此处的更多信息,谢谢。非常有帮助,现在我可以将这个独特的扩展用于我们面临的另一个案例。谢谢各位。非常有用。
SelectMany(grp => grp.ToList())
myCSTotal2.AddRange(userTotals.Where(w => w.priceinfoId == priceinfoID)
                              .Select( o => new Model.MyCSTotal2
                               {
                                PriceinfoID = o.priceinfoId,
                                BillcodeID = o.billcodeid,
                                JobTypeID = o.jobtypeID,
                                SaleTypeID = o.saletypeID,
                                RegratesID = o.regratesID,
                                NatAccPerc = o.natAcctPerc,
                                NatIgnInCommCalc = o.natIgnInCommCalc,
                                TermLength = (int)o.termLength,
                                Amount = o.RMR1YrTotal / 12,
                                RuleEvaluation = 0
                              });