C# 读写';n';txt文件中的随机行数

C# 读写';n';txt文件中的随机行数,c#,winforms,C#,Winforms,我试图从一个包含200个条目(行)的文本文件中读取(n)个随机行,并填充一个名为“recSongs”的列表框。我提供了一些简单的代码,可以从文本文件中随机检索一行,但我希望检索n个数量 这是我的密码 var lines = File.ReadAllLines(@"file.txt"); var r = new Random(); var randomLineNumber = r.Next(0, lines.Length - 1); var line = lines[randomLineNumbe

我试图从一个包含200个条目(行)的文本文件中读取(n)个随机行,并填充一个名为“recSongs”的列表框。我提供了一些简单的代码,可以从文本文件中随机检索一行,但我希望检索n个数量

这是我的密码

var lines = File.ReadAllLines(@"file.txt");
var r = new Random();
var randomLineNumber = r.Next(0, lines.Length - 1);
var line = lines[randomLineNumber];
recSongs.Items.Add(line);

n将是输入,即所需的行数

List <string> text = File.ReadLines("file.txt").Take(n).ToList();
List text=File.ReadLines(“File.txt”).Take(n.ToList();
编辑

如果你需要随机线,你可以

        string[] lines = File.ReadAllLines(@"C:\YourFile.txt");
        List<string> source = new List<string>();
        int n = 10;
        for (int i = 0; i < n; i++)
        {
            source.Add(lines[new Random().Next(lines.Length)]);
        }
string[]lines=File.ReadAllLines(@“C:\YourFile.txt”);
列表源=新列表();
int n=10;
对于(int i=0;i
n将作为输入,即您需要的行数

List <string> text = File.ReadLines("file.txt").Take(n).ToList();
List text=File.ReadLines(“File.txt”).Take(n.ToList();
编辑

如果你需要随机线,你可以

        string[] lines = File.ReadAllLines(@"C:\YourFile.txt");
        List<string> source = new List<string>();
        int n = 10;
        for (int i = 0; i < n; i++)
        {
            source.Add(lines[new Random().Next(lines.Length)]);
        }
string[]lines=File.ReadAllLines(@“C:\YourFile.txt”);
列表源=新列表();
int n=10;
对于(int i=0;i
这将向您的收藏中添加
numLines
随机行。请注意,有可能存在重复项

var lines = File.ReadAllLines(@"file.txt");
var r = new Random();
int numLines = 5;

for (int i = 0; i < numLines; i++)
{
    recSongs.Items.Add(lines[r.Next(0, lines.Length - 1)]);
}
var lines=File.ReadAllLines(@“File.txt”);
var r=新的随机变量();
int numLines=5;
对于(int i=0;i
要强制实施唯一项,可以执行以下操作:

for (int i = 0; i < numLines; i++)
{
    var randomItem = string.Empty;

    do
    {
        randomItem = lines[r.Next(0, lines.Length - 1)];

    } while (recSongs.Contains(randomItem));

    recSongs.Items.Add(randomItem);
}
for(int i=0;i

但现在请注意,它可能永远不会退出。随机的快乐

这将向您的收藏添加
numLines
随机行。请注意,有可能存在重复项

var lines = File.ReadAllLines(@"file.txt");
var r = new Random();
int numLines = 5;

for (int i = 0; i < numLines; i++)
{
    recSongs.Items.Add(lines[r.Next(0, lines.Length - 1)]);
}
var lines=File.ReadAllLines(@“File.txt”);
var r=新的随机变量();
int numLines=5;
对于(int i=0;i
要强制实施唯一项,可以执行以下操作:

for (int i = 0; i < numLines; i++)
{
    var randomItem = string.Empty;

    do
    {
        randomItem = lines[r.Next(0, lines.Length - 1)];

    } while (recSongs.Contains(randomItem));

    recSongs.Items.Add(randomItem);
}
for(int i=0;i

但现在请注意,它可能永远不会退出。随机的快乐

可能最简单的方法(虽然不是最有效的内存)是将文件拖到内存中的行集合中,然后
Shuffle()
行,并根据需要取任意多行:

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> input)
    {
        var buffer = input.ToArray();
        //Math.Random is OK for "everyday" randomness;
        //use RNGCryptoServiceProvider if you need 
        //cryptographically-strong randomness
        var rand = new Random();

        //As the loop proceeds, the element to output will be randomly chosen
        //from the elements at index i or above, which will then be swapped 
        //with i to get it out of the way; the yield return gives us each 
        //shuffled value as it is chosen, and allows the shuffling to be lazy.
        for (int i = 0; i < buffer.Length; i++)
        {
            int j = rand.Next(i, buffer.Length);
            yield return buffer[j];
            //if we cared about the elements in the buffer this would be a swap,
            //but we don't, so...    
            buffer[j] = buffer[i];
        }
    }

    ...

    string[] fileLines = GetLinesFromFile(fileName); //a StreamReader makes this pretty easy
    var randomLines = fileLines.Shuffle().Take(n);
公共静态IEnumerable Shuffle(此IEnumerable输入)
{
var buffer=input.ToArray();
//数学。随机性对于“每天”的随机性来说是可以的;
//如果需要,请使用RNGCryptoServiceProvider
//密码学强随机性
var rand=new Random();
//随着循环的进行,将随机选择要输出的元素
//从索引i或更高的元素,然后将交换这些元素
//我想把它弄出去,收益率给了我们每个人
//在选择时,将其作为随机值,并允许延迟随机。
for(int i=0;i
一些注意事项:

  • 对于一个大约200行的文本文件来说,这应该可以很好地工作;超过几十万行,您将开始出现内存问题。一个更具可扩展性的解决方案是将行号数组洗牌,然后使用这些行号查找并读取所需的特定行,丢弃所有其他行
  • 此解决方案以随机顺序生成随机线。如果要保留文件中行的顺序,请执行行号变体,对所选行号进行排序,然后在从文件中读取行后将其保持在该顺序

也许最简单的方法,尽管不是最有效的内存,是将文件拖到内存中的行集合中,然后
Shuffle()
这些行,然后根据需要取任意多行:

    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> input)
    {
        var buffer = input.ToArray();
        //Math.Random is OK for "everyday" randomness;
        //use RNGCryptoServiceProvider if you need 
        //cryptographically-strong randomness
        var rand = new Random();

        //As the loop proceeds, the element to output will be randomly chosen
        //from the elements at index i or above, which will then be swapped 
        //with i to get it out of the way; the yield return gives us each 
        //shuffled value as it is chosen, and allows the shuffling to be lazy.
        for (int i = 0; i < buffer.Length; i++)
        {
            int j = rand.Next(i, buffer.Length);
            yield return buffer[j];
            //if we cared about the elements in the buffer this would be a swap,
            //but we don't, so...    
            buffer[j] = buffer[i];
        }
    }

    ...

    string[] fileLines = GetLinesFromFile(fileName); //a StreamReader makes this pretty easy
    var randomLines = fileLines.Shuffle().Take(n);
公共静态IEnumerable Shuffle(此IEnumerable输入)
{
var buffer=input.ToArray();
//数学。随机性对于“每天”的随机性来说是可以的;
//如果需要,请使用RNGCryptoServiceProvider
//密码学强随机性
var rand=new Random();
//随着循环的进行,将随机选择要输出的元素
//从索引i或更高的元素,然后将交换这些元素
//我想把它弄出去,收益率给了我们每个人
//在选择时,将其作为随机值,并允许延迟随机。
for(int i=0;i
一些注意事项:

  • 对于一个大约200行的文本文件来说,这应该可以很好地工作;超过二十万