c# - 从列表中取出 30 个随机元素
问题描述
我有一个字符串列表,其中包含大量带有文本的主题标签。ex #csharp #java 等。每个主题标签都是列表中的一个自己的字符串。我现在想随机总是 console.writeline 该列表的 30 项。
列表
List<string> Hashtags = new List<string>();
写线
foreach (var x in Hashtags) {
Console.WriteLine(x);
}
理想情况下,我永远不想在随机 30 中拥有相同的主题标签。
解决方案
你应该试试这个:
var rnd = new Random();
foreach (var x in Hashtags.OrderBy(x => rnd.Next()).Take(30))
{
Console.WriteLine(x);
}
这很O(n^2)
复杂,但很容易阅读。
如果您想提高效率,请尝试使用 Fisher-Yates Shuffle,它是O(n)
,但可读性较差:
var take = 30;
var rnd = new Random();
for (var i = 0; i < (Hashtags.Count < take ? Hashtags.Count : take); i++)
{
var j = rnd.Next(Hashtags.Count);
(Hashtags[i], Hashtags[j]) = (Hashtags[j], Hashtags[i]);
}
foreach (var x in Hashtags.Take(take))
{
Console.WriteLine(x);
}
但是请记住,最好Random
每个线程实例化一次,所以这将是一个更好的方法:
[ThreadStatic]
private static Random rnd = new Random();
推荐阅读
- python - 如何从字典中制作加权图?
- abp - ABP 4.0 Blazor - 覆盖身份视图
- python - 赋值前引用的局部变量 | matplotlib
- angular - NestJS 服务器上的 Angular PWA 在新部署后崩溃
- python - 'float' 对象没有属性 'round'
- docker - Kaniko 中构建的容器目录权限不好,但在 Docker Desktop 中构建时可以工作
- api - 盈透证券API投资数量
- html - 在我的页面上实现 css '卡片显示'不起作用
- powershell - 尝试将此字符串中的数字数值转换为百分比。有没有简单的方法在powershell中做到这一点?
- java - 为什么当多个线程使用迭代器同时在同一个数组列表上工作时此代码不会抛出 ConcurrentModificationException