1

如果我的数据是 aList<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

4

5 回答 5

2

创建一个GetRange(Cat cat)按它排序您的列表的方法:

myCatList.OrderBy(cat=>GetRange(cat));
于 2013-04-11T19:02:51.073 回答
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);
于 2013-04-11T19:04:46.110 回答
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;
    });
于 2013-04-11T19:08:29.273 回答
0
//define your ranges  
var ranges = new[] { 3,8,10};

var grouped = listOfCats.GroupBy( x => ranges.FirstOrDefault( r => r >= x.Age ) );
于 2013-04-11T19:07:39.050 回答
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();
于 2013-04-11T19:07:41.840 回答