C# 使用LINQ如何根据范围对IEnumerable进行优先级排序?

C# 使用LINQ如何根据范围对IEnumerable进行优先级排序?,c#,linq,data-structures,C#,Linq,Data Structures,如果我的数据是一个列表,每只猫的年龄是10岁、9岁、8岁、7岁、6岁、5岁、4岁、3岁、2岁、1岁 我想根据范围1-3、4-8、9-10对列表重新排序 这样,生成的列表将 3,2,1,8,7,6,5,4,10,9 我该怎么做 我首先考虑创建三个查询: var band1 = myList.Where(c => c <= 3); var band2 = myList.Where(c => c => 4 && c <= 8); var band3 = m

如果我的数据是一个列表,每只猫的年龄是10岁、9岁、8岁、7岁、6岁、5岁、4岁、3岁、2岁、1岁

我想根据范围1-3、4-8、9-10对列表重新排序

这样,生成的列表将

3,2,1,8,7,6,5,4,10,9

我该怎么做

我首先考虑创建三个查询:

var band1 = myList.Where(c => c <= 3);
var band2 = myList.Where(c => c => 4 && c <= 8);
var band3 = myList.Where(c => c >= 9);
但是我不知道如何使用LINQ组合结果,因为我有三个IEnumerable

正确的方法是什么,或者我必须使用foreach吗?

创建一个GetRangeCat方法,按它对列表排序:

myCatList.OrderBy(cat=>GetRange(cat));
创建一个GetRangeCat方法,按其对列表排序:

myCatList.OrderBy(cat=>GetRange(cat));
你可以用

你可以用


你只需要用IEnumerable.concat来表示IEnumerable


你只需要用IEnumerable.concat来表示IEnumerable


这就是如何使用一条LINQ语句来实现您的要求

var ordered = items
    .OrderBy(x => {
        if(x <= 3) return 0;
        if(x <= 8) return 1;
        return 2;
    })
    .ThenByDescending(x => x);
或者,假设项目已按降序排列:

var ordered = myList
    .OrderBy(x => {
        if (x <= 3) { return 1; }
        if (x <= 8) { return 2; }
        return 3;
    });

这就是如何使用一条LINQ语句来实现您的要求

var ordered = items
    .OrderBy(x => {
        if(x <= 3) return 0;
        if(x <= 8) return 1;
        return 2;
    })
    .ThenByDescending(x => x);
或者,假设项目已按降序排列:

var ordered = myList
    .OrderBy(x => {
        if (x <= 3) { return 1; }
        if (x <= 8) { return 2; }
        return 3;
    });

+1只是不同的插入点,创建一个方法或一个扩展方法来返回排序范围,然后使用它。+1只是不同的插入点,创建一个方法或一个扩展方法来返回排序范围,然后使用它。钉住它。出于某种原因,我认为我必须使用select或更复杂的东西。谢谢大家!@SLC:如果您希望使用SelectMany,或者如果您有任意数量的序列要连接,您可以很容易地使用SelectMany这样做:new[]{band1,band2,band3}。SelectManyx=>x。或者在查询表达式表示法中,从x中的x开始,从x中的y开始,选择y。这说明了一个更一般的原理,即序列上的所有LINQ操作都可以使用SelectMany实现。或者,如果你真的想变得很无聊,它表示如何使用绑定单子和一些低阶函数来表示所有单子:搞定了。出于某种原因,我认为我必须使用select或更复杂的东西。谢谢大家!@SLC:如果您希望使用SelectMany,或者如果您有任意数量的序列要连接,您可以很容易地使用SelectMany这样做:new[]{band1,band2,band3}。SelectManyx=>x。或者在查询表达式表示法中,从x中的x开始,从x中的y开始,选择y。这说明了一个更一般的原理,即序列上的所有LINQ操作都可以使用SelectMany实现。或者,如果你真的想变得很无聊,它表示如何使用绑定单子和一些低阶函数来表示所有单子:然后,您需要将这些组展平,以获得所需的有序结果:。SelectManygroup=>group.OrderByDowneringCAT=>cat;您也没有很好地处理任何无效范围的情况;添加对该方法的支持会给该方法增加相当多的复杂性。然后,您需要将组展平,以获得所需的有序结果:。SelectManygroup=>group.OrderByDescendingcat=>cat;您也没有很好地处理任何无效范围的情况;添加对该方法的支持会给该方法增加相当多的复杂性。不要使用多个order by,您希望先执行order by,然后再执行ThenBy.Oops。降序只是为了确保降序不是隐式的。不要使用多个order by,要先执行order by,然后执行ThenBy.Oops。降序只是为了确保降序顺序不是隐含的。