c# groupby orderby thenby 尝试明确指定类型参数

c# groupby orderby thenby Try specifying the type arguments explicitly

我想使用 Grade 进行分组,并根据每个组中元素的数量降序排序,然后使用 Number 属性 对每个组元素进行升序排序。我试过了,但没有用。你能帮我解决我做错的地方吗?

错误内容如下:
无法从用法中推断方法 'System.Linq.Enumerable.OrderBy<TSource,TKey>(System.Collections.Generic.IEnumerable, System.Func<TSource,TKey>)' 的类型参数。尝试明确指定类型参数。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp6
{
    internal class Program
    {
        static void Main(string[] args)
        {
            List<Test> list = new List<Test>
            {
                new Test { Grade = "C", Name = "apple1", Number = 10 },
                new Test { Grade = "C", Name = "apple2", Number = 90 },
                new Test { Grade = "C", Name = "apple3", Number = 30 },
                new Test { Grade = "B", Name = "orange1", Number = 12 },
                new Test { Grade = "B", Name = "orange2", Number = 31 },
                new Test { Grade = "A", Name = "pineapple1", Number = 63 },
                new Test { Grade = "A", Name = "pineapple2", Number = 13 },
                new Test { Grade = "A", Name = "pineapple3", Number = 23 },
                new Test { Grade = "A", Name = "pineapple4", Number = 93 },
                new Test { Grade = "A", Name = "pineapple5", Number = 463 },
                new Test { Grade = "A", Name = "pineapple6", Number = 14 },
                new Test { Grade = "D", Name = "watermelon", Number = 74 }
            };

            //

            //CS0411
            //The type arguments for method cannot be inferred from the usage.
            //Try specifying the type arguments explicitly.
            var aaa = list.GroupBy(x => x.Grade, x => (x.Name, x.Number))
                .Where(g => g.Count() >= 1)
                .OrderByDescending(g => g.Count())
                .ThenBy(g => g.Select(a => a.Number).ToList().Sort((x, y) => x.CompareTo(y)))
                .ToList();

            //expected answers
            //{ Grade = "A", Name = "pineapple2", Number = 13 }
            //{ Grade = "A", Name = "pineapple6", Number = 14 }
            //{ Grade = "A", Name = "pineapple3", Number = 23 }
            //{ Grade = "A", Name = "pineapple1", Number = 63 }
            //{ Grade = "A", Name = "pineapple4", Number = 93 }
            //{ Grade = "A", Name = "pineapple5", Number = 463 }
            //{ Grade = "C", Name = "apple1", Number = 10 }
            //{ Grade = "C", Name = "apple3", Number = 30 }
            //{ Grade = "C", Name = "apple2", Number = 90 }
            //{ Grade = "B", Name = "orange1", Number = 12 }
            //{ Grade = "B", Name = "orange2", Number = 31 }
            //{ Grade = "D", Name = "watermelon", Number = 74 }
        }
    }
    class Test
    {
        public string Grade { get; set; }
        public string Name { get; set; }
        public int Number { get; set; }
    }
}

I want to group using Grade and sort in descending order based on the number of elements in each group, then use the Number property to sort each group element in ascending order.

这不是 ThenBy 的目的。 ThenBy 为同一序列 提供二次排序。它并不意味着对序列中的 within 项进行排序。 (此外,ThenBy 中 lambda 表达式的最后一部分是 List<T>.Sort,其中 returns void... 而编译器期望委托 returns“您想通过以下方式执行二次排序的东西。)

“外部序列”最终成为一组序列。如果你想转换每个组,你需要使用 Select。所以我怀疑你想要:

var aaa = list.GroupBy(x => x.Grade, x => (x.Name, x.Number))
    // Order the groups by descending size of group
    .OrderByDescending(g => g.Count())
    // Order the elements of each individual group by number
    .Select(group => group.OrderBy(a => a.Number).ToList())
    .ToList();

注意:我删除了 Where 子句,因为 GroupBy 永远不会产生任何空组。

或者,鉴于 GroupBy 返回的组的元素与原始序列中的元素相同,您可以先按数字对原始序列进行排序:

var aaa = list
    .OrderBy(x => x.Number)
    .GroupBy(x => x.Grade, x => (x.Name, x.Number))
    .OrderByDescending(g => g.Count())
    .ToList();

这样你仍然会得到一系列 IGrouping 元素,而不仅仅是一系列列表...这意味着你仍然可以访问每个组的密钥。