c#当值相同时,对列表进行随机排序
我有一个按分数排序的列表,如下所示:c#当值相同时,对列表进行随机排序,c#,linq,sorting,C#,Linq,Sorting,我有一个按分数排序的列表,如下所示: var orderedList = outcomeRequestModels .Where(m => m.Score > 0) .OrderByDescending(m => m.Score).ToList(); var t = [{ name: 'test 1', score: 20 }, { name: 'test 2', score: 30 }, { name: 'test 3', score
var orderedList = outcomeRequestModels
.Where(m => m.Score > 0)
.OrderByDescending(m => m.Score).ToList();
var t = [{
name: 'test 1',
score: 20
}, {
name: 'test 2',
score: 30
}, {
name: 'test 3',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 6',
score: 30
}, {
name: 'test 7',
score: 15
}, {
name: 'test 8',
score: 20
}, {
name: 'test 9',
score: 30
}];
var t = [{
name: 'test 9',
score: 30
}, {
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 1',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 8',
score: 20
}, {
name: 'test 7',
score: 15
}];
var t = [{
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 9',
score: 30
}, {
name: 'test 8',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 1',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 7',
score: 15
}];
我想做的是,随机选择列表中得分相同的项目。
因此,如果我有这样一个项目列表:
var orderedList = outcomeRequestModels
.Where(m => m.Score > 0)
.OrderByDescending(m => m.Score).ToList();
var t = [{
name: 'test 1',
score: 20
}, {
name: 'test 2',
score: 30
}, {
name: 'test 3',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 6',
score: 30
}, {
name: 'test 7',
score: 15
}, {
name: 'test 8',
score: 20
}, {
name: 'test 9',
score: 30
}];
var t = [{
name: 'test 9',
score: 30
}, {
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 1',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 8',
score: 20
}, {
name: 'test 7',
score: 15
}];
var t = [{
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 9',
score: 30
}, {
name: 'test 8',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 1',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 7',
score: 15
}];
我希望它的顺序如下:
var orderedList = outcomeRequestModels
.Where(m => m.Score > 0)
.OrderByDescending(m => m.Score).ToList();
var t = [{
name: 'test 1',
score: 20
}, {
name: 'test 2',
score: 30
}, {
name: 'test 3',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 6',
score: 30
}, {
name: 'test 7',
score: 15
}, {
name: 'test 8',
score: 20
}, {
name: 'test 9',
score: 30
}];
var t = [{
name: 'test 9',
score: 30
}, {
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 1',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 8',
score: 20
}, {
name: 'test 7',
score: 15
}];
var t = [{
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 9',
score: 30
}, {
name: 'test 8',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 1',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 7',
score: 15
}];
如果我再看一遍,它会像这样改变顺序:
var orderedList = outcomeRequestModels
.Where(m => m.Score > 0)
.OrderByDescending(m => m.Score).ToList();
var t = [{
name: 'test 1',
score: 20
}, {
name: 'test 2',
score: 30
}, {
name: 'test 3',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 6',
score: 30
}, {
name: 'test 7',
score: 15
}, {
name: 'test 8',
score: 20
}, {
name: 'test 9',
score: 30
}];
var t = [{
name: 'test 9',
score: 30
}, {
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 1',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 8',
score: 20
}, {
name: 'test 7',
score: 15
}];
var t = [{
name: 'test 6',
score: 30
}, {
name: 'test 2',
score: 30
}, {
name: 'test 9',
score: 30
}, {
name: 'test 8',
score: 20
}, {
name: 'test 4',
score: 20
}, {
name: 'test 5',
score: 20
}, {
name: 'test 1',
score: 20
}, {
name: 'test 3',
score: 20
}, {
name: 'test 7',
score: 15
}];
有人知道我是如何做到这一点的吗?您可以通过在任意指定的唯一值上“断开领带”来随机化:
var orderedList = outcomeRequestModels
.Select(m => new {Model = m, RandomId = Guid.NewGuid()})
.Where(m => m.Model.Score > 0)
.OrderByDescending(m => m.Model.Score)
.ThenBy(m => m.RandomId)
.Select(m => m.Model)
.ToList();
当然,这不是真正的随机性,但会给人一种相当随意的感觉。相同的方法可用于随机
的实例,无需太多更改:
var rnd = new Random();
var orderedList = outcomeRequestModels
.Select(m => new { Model = m, RandomId = rnd.Next() })
.Where(m => m.Model.Score > 0)
.OrderByDescending(m => m.Model.Score)
.ThenBy(m => m.RandomId)
.Select(m => m.Model)
.ToList();
击败它-但在另一个答案上略有变化,以帮助ORM评论 像这样的怎么样
var rnd = new Random();
var orderedList = models
.Where(m => m.Score > 0)
.AsEnumerable() // Optional - This should alleviate the ORM comment in the previous answer
.Select(m => new { m.Name, m.Score, Rand = rnd.Next() })
.OrderByDescending(m => m.Score).ThenBy(m => m.Rand)
.Select(m => new { m.Name, m.Score }) // Optional
.ToList();
我认为您可以执行如下操作:
var orderedList=outcomeRequestModels.Where(m=>m.Score>0)、OrderByDescending(m=>m.Score)、OrderBy(x=>Guid.NewGuid()).ToList()
@Steve Guid是唯一的,不是随机的,也不是一个合适的随机性来源。@Steve您需要然后通过,并且您还希望预先将相同的Guid
与每个记录关联,以避免在排序记录时出现不一致。@DasLinkedIn快速阅读Linq2ObjectsEnumerableSorter
(OrderBy的业务端)看起来它在进行任何排序之前构建了一个排序键数组,而排序中使用的正是这个数组。当然,这是一个实现细节,所以可能最好不要过于依赖这种行为。@spender很高兴知道,非常感谢!…尽管@Servy在上面关于GUID是唯一的而不是rando的评论m仍然是相关的。在OPs的情况下可能不相关,但如果您使用Random
,那么您将很难将其用于ORM(即EF)@在我的书中,Servy是一个无可争议的吹毛求疵的拥护者,所以在某个时候,我不再关注他非常重要的评论。