首页 > 解决方案 > 创建重复的子数组并随机化顺序c#

问题描述

我正在从数据库中返回一个项目列表。列表包含 id、名字、姓氏、销售数量、收入美元等信息。

1 John James 431 213000
2 Scott Smith 301 43000
3 Jane Doe 431 300000
4 Tess Jones 431 14280

我的结果将包含如上所示的 4 行。我根据 #sales 值以降序排列我的行。如果 #sales 值相同,则我按 id 订购。所以订购后我的结果将如下所示:

3 Jane Doe 431 300000
1 John James 431 213000
4 Tess Jones 431 14280
2 Scott Smith 301 43000

现在我想随机化#sales 相同的行的顺序。我确信这意味着我可能不会使用 id 的顺序。

如何创建#sales 相同的结果子数组,然后随机化它们的顺序并将其插入原始数组?我这样做的主要原因是为我将显示的数据添加一些多样性,使其不一样,并让用户有机会以不同的顺序显示。

这就是我获取原始数据的方式:

results = results.OrderByDescending(x => Math.Max((uint)x.TotalSales, x.TotalRevenue))
                            .GroupBy(x => x.Id)
                            .Select(x => x.First()).ToList();

我相信我将按如下方式应用随机化部分:

var randomIndx= new Random(TotalSales).Next(100) % (#: will this be the number of duplicates?);

以便

我不知道如何把事情放在一起。非常感谢任何有用的提示。

标签: c#

解决方案


使用 将排序应用于您的集合Random,这将随机播放结果。使用ThenBy将确保条目仅在其上一级排序中被打乱(项目将在其相同的“NumOfSales”中打乱)。

例如,与类:

public class Employee
{
    public int Id{get;set;}
    public string Name{get;set;}
    public int NumOfSales{get;set;}
    public int Revenue{get;set;}
}

您的代码可能如下所示:

var originalEmployeeList = new List<Employee>()
{
    new Employee { Id = 1, Name = "John James", NumOfSales = 431, Revenue = 213000 },
    new Employee { Id = 2, Name = "Scott Smith", NumOfSales = 301, Revenue = 43000 },
    new Employee { Id = 3, Name = "Jane Doe", NumOfSales = 431, Revenue = 300000 },
    new Employee { Id = 4, Name = "Tess Jones", NumOfSales = 431, Revenue = 14280 },
};

var random = new Random();
var randomizedResults = originalEmployeeList
    .OrderByDescending(x => x.NumOfSales)
    .ThenBy(x => random.Next())
    .ToList();

这里的关键是使用random.Next()INSIDE a ThenBy. 在此示例中,NumOfSales = 431 的人员将始终出现在 NumOfSales = 301 的人员之前,但相同 NumOfSales 中的人员列表将是随机的。

这是一个可运行的示例:https ://dotnetfiddle.net/W2ESGt


推荐阅读