在Hashtable实现中需要帮助

raf*_*ael 2 c# string hashtable

我是C#的初学者,我试着编写一个从输入的字符串中提取单词的程序,用户必须输入单词的最小长度来过滤单词输出...我的代码看起来不太好或者直观,我使用两个数组countStr来存储单词,countArr存储对应于每个单词的单词长度..但问题是我需要使用散列表而不是那两个数组,因为它们的大小都取决于用户输入的字符串长度,我认为这对记忆或其他东西不太安全?

这是我的简陋代码,我再次试图用一个哈希表替换这两个数组,怎么办呢?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace ConsoleApplication2
{
class Program
{

    static void Main(string[] args)
    {
        int i = 0 ;
        int j = 0;
        string myString = "";
        int counter = 0;
        int detCounter = 0;          

        myString = Console.ReadLine();
        string[] countStr = new string[myString.Length];
        int[] countArr = new int[myString.Length];

        Console.Write("Enter minimum word length:");
        detCounter = int.Parse(Console.ReadLine());

        for (i = 0; i < myString.Length; i++)
        {
            if (myString[i] != ' ')
            {
                counter++;
                countStr[j] += myString[i];
            }
            else
            {
                countArr[j] = counter;
                counter = 0;
                j++;
            }                                               
        }

        if (i == myString.Length)
        {
            countArr[j] = counter;
        }

        for (i = 0; i < myString.Length ; i++)
        {
           if (detCounter <= countArr[i])
            {
                Console.WriteLine(countStr[i]);
            }   
        }

     Console.ReadLine();     

    }        
  }
 } 
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 12

对于第一次尝试你并没有做得太糟糕,但这可能会好得多.

第一件事:在解析人类的整数输入时使用TryParse而不是Parse.如果人类输入"HELLO"而不是整数,那么如果使用Parse,程序将会崩溃; 只有当你知道它是一个整数时才使用Parse .

接下来:考虑使用String.Split将字符串拆分为单词数组,然后处理单词数组.

接下来的事情:像你这样具有大量阵列突变的代码很难阅读和理解.考虑将您的问题表征为查询.你想问什么?我不确定我是否完全理解你的代码,但听起来像是你试图说"把这些单词用空格隔开.取一个最小长度.给我所有字符串中的所有单词都超过最小值长度." 是?

在这种情况下,编写看起来像这样的代码:

string sentence = whatever;
int minimum = whatever;
var words = sentence.Split(' ');
var longWords = from word in words 
                where word.Length >= minimum 
                select word;
foreach(var longWord in longWords) 
    Console.WriteLine(longWord);
Run Code Online (Sandbox Code Playgroud)

你去吧 注意代码如何读取它正在做的事情.尝试编写代码,以便代码传达代码的含义,而不是代码的机制.

  • @rafael:好问题.一个完整的答案会很长,但简单来说,我的理由是使用var进一步强调了*机制*上代码的*含义*.什么是文字?谁在乎?它是一个单词集合,您需要为此算法的目的而担心.什么是长词?谁在乎?这是过滤"单词"的结果,这就是你需要担心的.是否是string []或List <string>或IEnumerable <string>或IList <string>或其他什么问题?不,重要的是它的含义,而不是其存储的细节. (10认同)