【问题标题】:Auto-generate a list of words in C#, and save as File [closed]在 C# 中自动生成单词列表,并保存为文件 [关闭]
【发布时间】:2023-03-29 05:20:01
【问题描述】:

我在编写接受单个参数long i 的方法时需要帮助:

public static string GetWord(long i)
{
    string s = "";

    //Update s using i

    return s;
}

...对于我的保存 ASCII 字文件的程序...

public static void main(string[] args) 
{
    try
    {
        int First = int.Parse(args[0]);
        int Last = int.Parse(args[1])
        string Filename = args[2]

        for(int i = start; i <= end; i++)
             File.AppendLine(Filename, GetWord(i));

        Console.WriteLine("Process complete");

    } 
    catch(Exception ex)
    {
        Console.WriteLine(ex.Message);

    }

}

...使用以下模式。

GetWord(0) 应该是Encoding.ASCII.GetString(new byte[]{ 0 }); 的结果

GetWord(1) 应该是Encoding.ASCII.GetString(new byte[]{ 1 }); 的结果

GetWord(2) 应该是Encoding.ASCII.GetString(new byte[]{ 2 }); 的结果

...以此类推,直到GetWord(127)

GetWord(128) 应该是GetWord(0) + Encoding.ASCII.GetString(new byte[]{ 0 }); 的结果

GetWord(129) 应该是GetWord(0) + Encoding.ASCII.GetString(new byte[]{ 1 }); 的结果

GetWord(130) 应该是GetWord(0) + Encoding.ASCII.GetString(new byte[]{ 2 }); 的结果

...以此类推,直到GetWord(255)

GetWord(256) 应该是GetWord(1) + Encoding.ASCII.GetString(new byte[]{ 0 }); 的结果

GetWord(257) 应该是GetWord(1) + Encoding.ASCII.GetString(new byte[]{ 1 }); 的结果

GetWord(258) 应该是GetWord(1) + Encoding.ASCII.GetString(new byte[]{ 2 }); 的结果

...以此类推,直到GetWord(16383)

GetWord(16384) 应该是GetWord(0) + GetWord(0) + Encoding.ASCII.GetString(new byte[]{ 0 }); 的结果

GetWord(16385) 应该是GetWord(0) + GetWord(0) + Encoding.ASCII.GetString(new byte[]{ 1 }); 的结果

GetWord(16386) 应该是GetWord(0) + GetWord(0) + Encoding.ASCII.GetString(new byte[]{ 2 }); 的结果

写下模式有助于我思考代码。我希望这对每个人都有意义。我认为我需要混合使用递归和模数才能使其正常工作。

【问题讨论】:

  • 所以你想在你的方法中使用一个 long 类型的参数,循环直到那个数字生成单词?
  • 作为拥有 3.3k 代表的用户,您应该知道“我需要一种方法”不是寻求帮助,而是寻求解决方案 :-)
  • 我投票决定将此问题作为题外话结束,因为正如您所做的那样,我有一种方法可以做到这一点,但不幸的是我把它留在了出租车上。那时我还年轻得多。该算法是如何出现的,混合了记忆和欲望......
  • 我的意思是,我们强制用户分享他们尝试过的东西,这样我们就可以帮助他们解决问题,而不是用勺子喂他们想要的东西 :-) 顺便说一句,我的评论无意伤害。
  • 注意:Word[128] 到 Word[255] 都将是“?”。

标签: c# string file ascii auto-generate


【解决方案1】:

我只是要给你算法。

请注意,每 256 是一个循环。从索引 256 开始,您将附加到 Word[0],,从 512 开始,您将附加到 Word[1],从 65536 开始,您将附加到 Word[0] + Word[0],即 Word[256]

所以算法是把index/256 - 1作为你要附加的索引,index%256是你需要附加的字节

【讨论】:

    【解决方案2】:

    我想出的解决方案如下:

    public void AppendFile(string filePath, long firstWord, long lastWord)
    {            
        using (StreamWriter sw = File.AppendText(filePath))
        {
            for (long i = firstWord; i < lastWord; i++)
            {
                sw.WriteLine(GetWord(i));
    
            }
    
        }
    
    }
    
    public void AppendFile(string filePath, long lastWord)
    {
        AppendFile(filePath, 0, lastWord);
    
    }
    
    public void AppendFile(string filePath)
    {
        AppendFile(filePath, long.MaxValue);
    
    }
    
    public static string GetWord(long i)
    {
        string s = Encoding.ASCII.GetString(new byte[] { (byte)(i % 128) });
    
        if (i < 128)
            return s;
    
        return GetWord(i / 128) + s;
    
    }
    

    按以下方式使用:

    AppendFile("words.txt"); // Will most likely fall over or at least take a long time
    
    AppendFile("words.txt", 1000); // This is the method requested
    
    AppendFile("words.txt", 500, 1000); // Extended functionality
    

    注意:我选择不使用史蒂夫回答中的算法。我没有使用史蒂夫算法的原因是因为他依赖于在整个过程中驻留在内存中的完整单词数组,这将输出文件限制为可用可用 RAM 的数量。我的版本没有这个限制,并且仅限于字符串的最大可能长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-11
      • 2012-01-03
      • 1970-01-01
      相关资源
      最近更新 更多