繁体   English   中英

c#从txt文件读取'n'数量的随机行

[英]c# Read 'n' amount of random lines from txt file

我试图从大约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);

怎么样:

var lines = File.ReadAllLines("file.txt").OrderBy(x => Guid.NewGuid()).Take(n);

n将作为输入,即您不需要的行

List <string> 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)]);
        }

这会将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)]);
}

要实施唯一项,您可以执行以下操作:

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);
}

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

尽管不是最有效的内存,但最简单的方法可能是将文件插入到其行的内存中集合中,然后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);

一些注意事项:

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

尝试这个

var lines = File.ReadAllLines(@"file.txt");
var r = new Random();
int noLines = 10;// n lines

for (int i = 0; i < noLines; i++)
{
    var randomLineNumber = r.Next(0, lines.Length - 1);
    var line = lines[randomLineNumber];
    recSongs.Items.Add(line);
}

您可以执行以下操作:

HashSet<int> linesHash = new HashSet<int>();
var lines = file.ReadLines();
for (int i = 0; i < numLinesToGet; i++)
{
    int line=0;
    do
    { 
       line = rand.Next(0, lines.Length);
    }while(linesHash.Contains(line));
    linesHash.Add(line);
    linesAdded.Add(lines[line]);
}

请注意,如果要获取的行数大于我的代码永远不会结束的实际行数,那么在执行for循环之前必须进行一些检查。

var lines = File.ReadAllLines(@"file.txt");
var random = new Random();

var lines = Enumerable.Repeat( -1, n ) // -1 is a filler and is discarded by the select.
.Select( _ => random.Next(0, lines.Length - 1 ) )
.Select( index => lines[index] );

foreach( var line in lines )
{
    recSongs.Items.Add(line);
}
var lines = File.ReadAllLines(@"file.txt");
var r = new Random();

var randomized = lines.OrderBy(item => r.Next()); //randomize the list
recSongs.Items.AddRange(randomized.Take(N).ToArray()); //Add N amount to listbox

该解决方案还避免了重复的随机数

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM