我有一个字符串列表,其中包含带有文本的#标签。例如#csharp #java等等。每个主题标签是列表中自己的字符串。我现在想随机地总是console.writeline该列表的30个项目。
清单
List<string> Hashtags = new List<string>();
Run Code Online (Sandbox Code Playgroud)
写线
foreach (var x in Hashtags) {
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我永远都不想在随机30中拥有相同的主题标签。
您应该尝试这样:
var rnd = new Random();
foreach (var x in Hashtags.OrderBy(x => rnd.Next()).Take(30))
{
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
这具有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);
}
Run Code Online (Sandbox Code Playgroud)
不过请记住,最好Random每个线程实例化一次,因此这是一个更好的方法:
[ThreadStatic]
private static Random rnd = new Random();
Run Code Online (Sandbox Code Playgroud)