2009-09-08 4 views
4

.net 2.0 프레임 워크의 C#에서 문자열 배열의 임의의 값을 가져 오는 가장 빠른 방법은 무엇입니까? 나는 그들이이 있었다 수있는 생각 :C#의 문자열 배열에서 임의의 값을 가져 오는 가장 빠른 방법은 무엇입니까?

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

예, 비슷한가 더 많거나 적은 똑같이 짧고 달콤한이, GetRandomValue()는 실제 방법이 아닙니다 알아?

+0

당신이 무엇을 의미합니까 : (getrandomvalue)? 그것은 배열의 무작위 라인을 반환해야합니까? – Toad

+0

해시 값을 계산하고 싶습니까? 참조 : http://stackoverflow.com/questions/1388702/c-md5-calculation-issue –

답변

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 전자 확장 방법 :

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

이 그럼 당신은 정확히 예에 따라 사용할 수 있습니다 :

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

또 다른 방법은 rand [ThreadStatic]을 만들고 시스템 시간과 ThreadID에서 파생 된 시드를 사용하여 모두 잠그지 않는 것입니다. –

+0

Marc, perfect! –

+0

개인적으로, 저는 이것을 하나의 확장 메서드를 추가하는 약간의 남용이라고 생각합니다. 그것은 분명히 응용 프로그램 내의 모든 문자열 [] 배열에 필요하지 않습니다. –

1

실제로.

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

+1,이 또한 작동합니다. +1 라이너의 경우 –

1

시도 :

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

+1입니다. –

+3

이 작업을 여러 번 빠르게 호출하면 (예 : 긴밀한 루프) 매번 같은 줄이 반환됩니다. – LukeH

1

내가 배열은 이러한 기능을 지원 생각하지 않습니다. 가장 쉬운 방법은 임의의 숫자를 가져 와서 해당 항목을 가져 오는 것입니다.

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

+1,이 방법도 효과적입니다. –

0

Linq를하려면 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]); 
관련 문제