c# - 将文件中的 10 行随机行(不重复)写入 15 个文件中的每一个

Posted

技术标签:

【中文标题】c# - 将文件中的 10 行随机行(不重复)写入 15 个文件中的每一个【英文标题】:c# - write 10 random lines from a file (without duplicates) into each of 15 files 【发布时间】:2021-03-29 02:29:10 【问题描述】:

所以我一直在尝试制作一个函数

    遍历包含 26 个文件的文件夹中的每个文件, 从一个 20 行的文件中随机抽取 10 行, 检查当前选择的行是否已经在当前文件中,如果是则再次尝试选择, 将 10 个随机行写入每个文件。

这是我到目前为止所得到的。但我不知道为什么它总是越界。我曾尝试通过循环将文件中的行放入另一个数组中,但这也无济于事。有没有人看到有什么问题?

string[] lines = File.ReadAllLines(@"randomLines.txt");
assignLines(lines);
static void assignLines(string[] listOfLines)
         
            Random rnd = new Random();

            foreach (var file in Directory.EnumerateFiles(@"files", @"*.txt"))
            
                string[] assignedLines = new string[]  ;
                int j = 1;
                int i = 0;
                StreamWriter wr = new StreamWriter(file);
                while (i < 5)
                //for (int i = 0; i < File.ReadAllLines(file).Length + 1; i++)
                

                    int chosen = rnd.Next(0, listOfLines.Length - 1);

                    if (assignedLines.Contains(listOfLines[chosen]))
                    
                        continue;
                    
                    else
                    
                        assignedLines[i] = listOfLines[chosen];
                        wr.WriteLine(j + ". " + listOfLines[chosen] + ".");
                        j++;
                        i++;
                    
                
                wr.Close();
            
        

【问题讨论】:

分配的行是一个长度为 0 的数组 new string[] ; 我想您可能已经考虑将其用作 List 或者如果不是,它至少会让您的生活更轻松。 【参考方案1】:

您可以随机排列您的线,然后取出其中的 10 条,而不是获取一条随机线并每次循环槽线以查看它是否重复:

Random rnd = new Random();
string[] lines = File.ReadAllLines(@"randomLines.txt")
                 .OrderBy(x => rnd.Next())
                 Take(10)
                 .ToArray();

如果您在 cmets 中提到,您的行也可能包含重复项,然后在订购前删除重复项:

string[] lines = File.ReadAllLines(@"randomLines.txt")
                 .Distinct()     //this line will remove duplicates
                 .OrderBy(x => rnd.Next())
                 Take(10)
                 .ToArray();

现在您可以循环思想文件并编写这 10 行代码。

【讨论】:

你的解决方案的问题是它们会重复并且没有检查重复 那么这 20 行本身就有重复项?这 20 行可以包含重复项吗? 这20行没有重复 这很好用,感谢您只需将 .OrderBy(x =&gt; rnd.Next()) 更改为 .OrderBy(x =&gt; rnd.Next(0, listOfLines.Length -1)) 即可使用 @Typhoon 很高兴我能帮上忙【参考方案2】:

如果我明白你在问什么,理论上这应该对你有用

    string[] lines = File.ReadAllLines("FILE");
    
                // This will filter the array so that items which only appear once in 'lines' will be returned.
                // Once because lines will also contain the current item we are checking against.
                //Take 10 just returns the first 10 from that list
    string[] linesThatOnlyApprearOnce = lines.Where(x => lines.Count(y => x == y) == 1).Take(10).ToArray();

【讨论】:

以上是关于c# - 将文件中的 10 行随机行(不重复)写入 15 个文件中的每一个的主要内容,如果未能解决你的问题,请参考以下文章

2d 数组随机数(10 行,6 列)不重复到文件 C#

Laravel 分页显示重复和替换随机行

格式化的随机行数据写入本地文件,Python

格式化的随机行数据写入本地文件,Python

读取随机行 com 文件

从mysql中的大表中快速选择随机行