2009-09-08 77 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]); 
相關問題