【问题标题】:c# - splitting a large list into smaller sublistsc# - 将大列表拆分为较小的子列表
【发布时间】:2020-05-05 09:49:17
【问题描述】:

对 C# 相当陌生 - 坐在这里练习。我有一个包含 1000 万个密码的文件,列在一个文件中,我下载了它来练习。

我想将文件分解为 99 个列表。在 99 处停止然后做点什么。然后从它停止的地方开始,并用接下来的 99 重复执行某些操作,直到到达文件中的最后一项。

我可以很好地完成计数部分,它是在 99 停止并继续我离开的地方是我遇到问题的地方。我在网上找到的任何东西都与我想要做的事情不一样,而且我自己添加到此代码中的任何东西都不起作用。

如果我不清楚,我很乐意分享更多信息。只是问,然后会回复,我可能要到明天才能回复,具体取决于时间。

这是我开始的代码:

using System;
using System.IO;


namespace lists01
{
class Program
{
    static void Main(string[] args)
    {
        int count = 0;
        var f1 = @"c:\tmp\10-million-password-list-top-1000000.txt";           
        {                
            var content = File.ReadAllLines(f1);
            foreach (var v2 in content)
            {
                count++;
                Console.WriteLine(v2 + "\t" + count);
            }
        }
    }
}
}

我的最终目标是使用我拥有的文件中的任何项目列表来执行此操作。我只使用这个密码列表,因为它很大,并且认为它对这个练习有好处。

谢谢 基思

【问题讨论】:

  • 这是否回答了您的问题:Create batches in linq?
  • 我认为它可能 - 明天我回家后会尝试。经历了它 - 让我知道我需要去哪里。谢谢你的链接。当您不确定要问什么时,知道要使用哪些搜索词是最困难的部分。

标签: c# file routines


【解决方案1】:

这里有几种不同的方法来解决这个问题。通常,我会建议您在代码中使用 ReadAllLines 函数。权衡是您一次将整个文件加载到内存中,然后对它进行操作。

将 read all lines 与 Linq 的 Skip()Take() 方法结合使用,您可以将这些行分成如下组:

var lines = File.ReadAllLines(fileName);
int linesAtATime = 99;

for (int i = 0; i < lines.Length; i = i + linesAtATime)
{
    List<string> currentLinesGroup = lines.Skip(i).Take(linesAtATime).ToList();
    DoSomethingWithLines(currentLinesGroup);
}

但是,如果您正在处理一个非常大的文件,将整个文件加载到内存中可能不切实际。另外,您可能不想在处理线路时让文件保持打开状态。此选项使您可以更好地控制在文件中移动的方式。它只是将它需要的部分加载到内存中,并在您处理当前行集时关闭文件。

List<string> lines = new List<string>();
int maxLines = 99;
long seekPosition = 0;
bool fileLoaded = false;
string line;

while (!fileLoaded)
{
    using (Stream stream = File.Open(fileName, FileMode.Open))
    {
        //Jump back to the previous position
        stream.Seek(seekPosition, SeekOrigin.Begin);

        using (StreamReader reader = new StreamReader(stream))
        {
            while (!reader.EndOfStream && lines.Count < maxLines)
            {
                line = reader.ReadLine();
                seekPosition += (line.Length + 2); //Tracks how much data has been read.
                lines.Add(line);
            }
            fileLoaded = reader.EndOfStream;
        }
    }

    DoSomethingWithLines(lines);
    lines.Clear();
}

在这种情况下,我使用了Stream,因为它能够查找文件中的特定位置。但后来我使用了StreaReader,因为它有ReadLine() 方法。

【讨论】:

  • 昨晚和今天早上我一直在玩 ReadAllLines 示例。我花了一点时间才知道发生了什么。我现在明白了那个例子。我仍然需要练习您发布的第二个示例。太感谢了。这是相当的学习曲线。再次感谢您提供的示例
猜你喜欢
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2010-10-19
  • 2012-03-29
  • 2012-08-18
相关资源
最近更新 更多