簡體   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