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快速阅读Linq2Objects
EnumerableSorter
(OrderBy的业务端)看起来它在进行任何排序之前构建了一个排序键数组,而排序中使用的正是这个数组。当然,这是一个实现细节,所以可能最好不要过于依赖这种行为。@spender很高兴知道,非常感谢!…尽管@Servy在上面关于GUID是唯一的而不是rando的评论m仍然是相关的。在OPs的情况下可能不相关,但如果您使用
Random
,那么您将很难将其用于ORM(即EF)@在我的书中,Servy是一个无可争议的吹毛求疵的拥护者,所以在某个时候,我不再关注他非常重要的评论。