gpt4 book ai didi

C#:从 IEnumerable 获取随机值的优雅代码

转载 作者:可可西里 更新时间:2023-11-01 03:07:07 27 4
gpt4 key购买 nike

在 Python 中,我可以这样做:

>>> import random
>>> ints = [1,2,3]
>>> random.choice(ints)
3

在 C# 中,我做的第一件事是:

var randgen = new Random();
var ints = new int[] { 1, 2, 3 };
ints[randgen.Next(ints.Length)];

但这需要索引,ints 的重复也困扰着我。所以,我想到了这个:

var randgen = new Random();
var ints = new int[] { 1, 2, 3 };
ints.OrderBy(x=> randgen.Next()).First();

仍然不是很好和高效。是否有更优雅的方法从 IEnumberable 获取随机值?

最佳答案

这里有一些适合您的扩展方法:

public static T RandomElement<T>(this IEnumerable<T> enumerable)
{
return enumerable.RandomElementUsing<T>(new Random());
}

public static T RandomElementUsing<T>(this IEnumerable<T> enumerable, Random rand)
{
int index = rand.Next(0, enumerable.Count());
return enumerable.ElementAt(index);
}

// Usage:
var ints = new int[] { 1, 2, 3 };
int randomInt = ints.RandomElement();

// If you have a preexisting `Random` instance, rand, use it:
// this is important e.g. if you are in a loop, because otherwise you will create new
// `Random` instances every time around, with nearly the same seed every time.
int anotherRandomInt = ints.RandomElementUsing(rand);

一般IEnumerable<T> ,这将是 O(n),因为这是 .Count() 的复杂度和一个随机的 .ElementAt()称呼;但是,数组和列表都是特殊情况,因此在这些情况下它将是 O(1)。

关于C#:从 IEnumerable 获取随机值的优雅代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7258824/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com