我想从记事本中检索数据并在标签上随机显示。该项目是关于幸运抽奖系统,我需要随机显示员工ID。
以下是我的代码:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
// Create an instance of StreamReader to read from a file.
// The using statement also closes the StreamReader.
using (StreamReader sr = new StreamReader("C:/ Users / Nor Asyraf Mohd No / Documents / TestFile.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
string strRead = sr.ReadLine();
Random random = new Random();
Label1.Text = strRead.ToString();
}
}
}
catch (Exception i)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(i.Message);
}
}
答案 0 :(得分:0)
您的代码存在一些问题。首先,您应该声明一次Random
变量而不是循环内部。由于Random
使用系统时间作为种子,如果它在一个快速运行的循环内初始化,则每次迭代可能会得到相同的“随机”数。我通常只是将它声明为类字段,因此它也可以被其他方法使用。
同样,您可以将文件路径存储为类级别变量,而不是每次调用方法时。如果文件内容没有改变,你应该考虑在启动时将它们保存在List<string>
类字段中一次,而不是每次都读取文件。但我会假设文件内容可能会发生变化,因此我会将该代码留在方法中。
接下来,您可以使用File.ReadAllLines
一次获取文件的所有行,然后您可以在生成的文件行字符串数组中访问随机索引。
为了确保您不会多次显示同一项目,您可以将文件行读入List<string>
一次,然后在从该列表中选择随机项后删除它它不会再次使用。
例如:
private Random random = new Random();
private string testFilePath = @"c:\users\nor asyraf mohd no\documents\testfile.txt";
private List<string> testFileLines;
private void Form1_Load(object sender, EventArgs e)
{
if (!File.Exists(testFilePath))
{
MessageBox.Show($"The file does not exist: {testFilePath}");
}
else
{
try
{
testFileLines = File.ReadAllLines(testFilePath).ToList();
}
catch (Exception ex)
{
MessageBox.Show($"Could not read file {testFilePath}. Exception details: {ex}");
}
}
}
protected void Button1_Click(object sender, EventArgs e)
{
if (testFileLines != null && testFileLines.Count > 0)
{
var randomLine = testFileLines[random.Next(testFileLines.Count)];
Label1.Text = randomLine;
testFileLines.Remove(randomLine);
}
}