使用LINQ如何根据范围确定IEnumerable的优先级?

时间:2013-04-11 19:00:30

标签: c# linq data-structures

如果我的数据是List<Cat>且每只猫的年龄为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<Cat>

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

5 个答案:

答案 0 :(得分:2)

通过它创建一个GetRange(Cat cat)方法对您的列表进行排序:

myCatList.OrderBy(cat=>GetRange(cat));

答案 1 :(得分:2)

您可以使用Concat

var band1 = myList.Where(c => c <= 3);
var band2 = myList.Where(c => c => 4 && c <= 8);
var band3 = myList.Where(c => c >= 9);

var result = band1.Concat(band2).Concat(band3);

答案 2 :(得分:1)

这就是你如何使用单个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;
    });

答案 3 :(得分:0)

//define your ranges  
var ranges = new[] { 3,8,10};

var grouped = listOfCats.GroupBy( x => ranges.FirstOrDefault( r => r >= x.Age ) );

答案 4 :(得分:0)

您只需要将IEnumerable<int>IEnumerable<int>.Concat()

联系起来
var band1 = myList.Where(c => c <= 3);
var band2 = myList.Where(c => c >= 4 && c <= 8);
var band3 = myList.Where(c => c >= 9);

List<int> finalList = band1.Concat(band2).Concat(band3).ToList();
相关问题