C# 从 URL 中读取随机行

C# Read random line from URL

如果您不想了解我的逻辑处理过程,请跳至 TLDR 版本。

我一直在摆弄一个执行以下操作的程序: 单击按钮时,从本地存储的文本文档中读取随机行,无法重复自身

然而我不希望它做的是能够从 URL 中读取,而不是本地存储的解决方案。

所以我的以下代码是当前函数和我尝试的结果,以及它的结果。

string[] readText = File.ReadAllLines(@"path\file.txt");
Random rnd = new Random();
textBox1.Text=(readText[rnd.Next(readText.Length)]);

自然地,所有这一切都是从存储在路径部分的文件中读取,然后创建一个随机生成器,并使文本框的输出是整个文档中的随机行。

我尝试用 URL 做的事情 部分 有效..

WebClient webCon= new WebClient();
string webData = webCon.DownloadString("URL");
textBox1.Text = webData;

然后按以下生成文档的随机行:

Random rnd = new Random();
textBox1.Text = ((webData[rnd.Next(webData.Length-1)]));

但是这是无效的,然后我不得不按照以下方式将 char 转换为字符串,这导致了一个非常有趣且完全无用的文本框。

Random rnd = new Random();
textBox1.Text = char.ToString((webData[rnd.Next(webData.Length-1)]));

TL;DR 版本

我有一个使用以下方法从本地文件读取的程序:

string[] readText = File.ReadAllLines(path)

然后从所述文档生成随机行以显示在文本框中,如下所示:

Random rndm = new Random();
            textBox1.Text=(readText[rndm.Next(readText.Length)]);

但是我希望它能够执行的操作是从 URL(在线文档)中读取的。 我尝试使用 webClient 方法完成此任务,但它导致需要将文本框上的字符从 URL.

转换为字符串
WebClient webCon= new WebClient();
string webData = webCon.DownloadString("URL");
textBox1.Text = webData;

我希望这个问题尽可能接近于重新发布,我确实确保首先彻底检查了相关线程并且无法真正完成我的任务。提前致谢!

使用string.Split()方法怎么样?它会归结为这样的事情:

//\n denotes the newline caracter
var lines = webData.Split('\n');

您现在可以像处理从文件中获得的结果一样处理 lines 数组。

我还建议您像这样使用 WebClient

using (var webCon = new WebClient()) 
{
    string webData = webCon.DownloadString("URL");
    //process webData
}

using {} 部分确保您的 WebClient 得到正确处置(这会释放资源)。

对您的思考过程的更多解释:
string是由char组成的数组,所以如果访问里面的元素,我就是char类型:

string myVal = "hi mom";
char myChar = myVal[0];

Random 对象只应在您的应用程序中构建一次,因此请确保如果您在短时间内生成大量随机数,请重复使用同一个 Random 对象(或者您可能会收到多次相同的值)

完整示例:

private static Random _random = new Random();
static void Main(string[] args)
{
    using (var webCon = new WebClient())
    {
        var webData = webCon.DownloadString("");
        var lines = webData.Split('\n');
        var myRandomLine = lines[_random.Next(0, lines.Length - 1)];
        MyTextBlock.Text = myRandomLine;
    }
}