2009-09-08 81 views
4

从.net 2.0框架的C#中的字符串数组中获取随机值的最快方法是什么?我想他们可能有过这样的:从C#中的字符串数组中获取随机值的最快方法?

string[] fileLines = File.ReadAllLines(filePath); 
fileLines.GetRandomValue(); 

是的,我知道GetRandomValue()是不是一个实际的方法,有没有类似的东西,或多或少同样短暂的甜蜜?

+0

你是什么意思有:getrandomvalue()?它应该返回数组的一个随机行吗? – Toad 2009-09-08 09:01:51

+0

我想你想要计算某种散列值?请参阅:http://stackoverflow.com/questions/1388702/c-md5-calculation-issue – 2009-09-08 09:02:41

回答

12

不是内置的,但很容易添加...

static readonly Random rand = new Random(); 
public static T GetRandomValue<T>(T[] values) { 
    lock(rand) { 
     return values[rand.Next(values.Length)]; 
    } 
} 

(在static领域有助于确保,如果我们使用我们没有得到重复它在一个紧密的循环中,并且lock保持它对多个呼叫者的安全)

在C#3.0中,这可能是b为E的扩展方法:

public static T GetRandomValue<T>(this T[] values) {...} 

然后,你可以用它准确地按照你的例子:

string[] fileLines = File.ReadAllLines(filePath); 
string val = fileLines.GetRandomValue(); 
+0

另一种方法是使rand [ThreadStatic]并使用从系统时间和ThreadID派生的种子,并避免完全锁定... – 2009-09-08 09:12:56

+0

谢谢Marc,完美! – 2009-09-08 09:13:06

+0

就我个人而言,我认为这是一种滥用扩展方法来将其作为一个扩展方法。显然,应用程序中的所有字符串[]数组不是必需的。 – 2009-09-08 09:14:21

1

确实。

Random m = new Random(); 
string line = fileLines[m.Next(0, fileLines.Length); 
+0

+1,这也适用。 – 2009-09-08 09:14:08

1

尝试:

fileLines [new Random().Next (fileLines.Length)] 
+0

+1,为单线。 – 2009-09-08 09:17:03

+3

快速连续调用多次(例如,在紧密循环中)将每次都返回相同的行。 – LukeH 2009-09-08 09:28:58

1

我不认为阵列支持这样的功能。最简单的方法是获得一个随机数,并获得相应的项目。

Random rnd = new Random(); 
String item = fileLines[rnd.next(fileLines.Length); 
+0

+1,这也适用。 – 2009-09-08 09:14:44

0

LINQ to SQL的方式

var rFile = fileLines.OrderBy(x => Guid.NewGuid()).FirstOrDefault(); 

如果你看到错误,你应该添加System.Linq的;

0

我会用这种方法来从一个数组获得随机项:

string[] str = {"red","blue","pink","yellow","green","brown"}; 
int i = new Random.Next(0, str.length); 
MessageBox.Show(str[i]); 
相关问题