计算Array或List中的单词数

本文关键字:单词数 List Array 计算 | 更新日期: 2023-09-27 18:18:22

我需要计算数组或列表中的单词数。我说数组或列表的原因是因为我不确定在这种情况下哪个是最好的。数据是静态的,在.txt文件中(它实际上是一本书)。我能够创建一个数组并从数组中分解单词,但对于我的生命,我不能计数!我已经尝试了许多不同的方法来做到这一点,我认为,因为它是一个字符串,它是无法计数。我甚至摇摇欲坠地想把整本书打印到一个列表框里,然后从列表框里数数,但这太荒谬了。

public partial class mainForm : Form
{
    //------------------------
    //GLOBAL VARIABLES:
    //------------------------
    List<string> countWords;
    string[] fileWords;
    string[] fileLines;
    char[] delim = new char[] { ' ', ',','.','?','!' };
    string path;

    public mainForm()
    {
        InitializeComponent();
    }

    private void BookTitle() // TiTleAndAuthor Method will pull the Book Title and display it.
    {
        for (int i = 0; i < 1; i++)
        {
            bookTitleLabel.Text = fileLines[i];
        }
    }
    private void BookAuthor() // TiTleAndAuthor Method will pull the Book Author and display it.
    {
        for (int i = 1; i < 2; i++)
        {
            bookAuthorLabel.Text = fileLines[i];
        }
    }
    private void FirstLines() // FirstTenWords Method pulls the first ten words of any text file and prints the to a ListBox
    {
        for (int i = 0; i <= 499; i++)
        {
            wordsListBox.Items.Add(fileWords[i]);
        }
    }
    private void WordCount() // Count all the words in the file.
    {
    }  


    private void openFileButton_Click(object sender, EventArgs e)
    {
        OpenFileDialog inputFile = new OpenFileDialog();
        if (inputFile.ShowDialog() == DialogResult.OK)        // check the file the user selected
        {
            path = inputFile.FileName;                 // save that path of the file to a string variable for later use
            StreamReader fileRead = new StreamReader(path);     // read a file at the path outlined in the path variable
            fileWords = fileRead.ReadToEnd().Split(delim); // Breakdown the text into lines of text to call them at a later date
            fileLines = File.ReadAllLines(path);
            countWords = File.ReadLines(path).ToList();
            wordsListBox.Items.Clear();
            BookTitle();
            BookAuthor();
            FirstLines();
            WordCount();
        }
        else
        {
            MessageBox.Show("Not a valid file, please select a text file");
        }
    }
}

计算Array或List中的单词数

也许这是有用的:

    static void Main(string[] args)
    {
        string[] lines = File_ReadAllLines();
        List<string> words = new List<string>();
        foreach(var line in lines)
        {
            words.AddRange(line.Split(' '));
        }
        Console.WriteLine(words.Count);
    }
    private static string[] File_ReadAllLines()
    {
        return new[] {
            "The one book",
            "written by gnarf",
            "once upon a time ther werent any grammer",
            "iso 1-12122-445",
            "(c) 2012 under the hills"
        };
    }

在我给出答案之前,先快速观察一下其中的一些循环:

for (int i = 1; i < 2; i++)
    {
        bookAuthorLabel.Text = fileLines[i];
    }

这只会运行一次,所以把它放在循环中是没有意义的(除非你想让它实际上循环遍历整个列表,在这种情况下这是一个bug)。如果这是预期的行为,您不妨直接执行

bookAuthorLabel.Text = fileLines[1];

你这里有类似的东西:

for (int i = 0; i < 1; i++)
    {
        bookTitleLabel.Text = fileLines[i];
    }

再说一遍,这是没有意义的。

现在是答案本身。我不确定您是想获得总字数计数还是单个单词计数,因此这里有一个代码示例,用于同时进行这两项操作:

private static void CountWords()
    {
        const string fileName = "CountWords.txt";
        // Create a dummy file
        using (var sw = new StreamWriter(fileName))
        {
            sw.WriteLine("This is a short sentence");
            sw.WriteLine("This is a long sentence");
        }
        string text = File.ReadAllText(fileName);
        string[] result = text.Split(new[] { " ", Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
        // Total word count
        Console.WriteLine("Total count: " + result.Count().ToString());
        // Now to illustrate getting the count of individual words
        var dictionary = new Dictionary<string, int>();
        foreach (string word in result)
        {
            if (dictionary.ContainsKey(word))
            {
                dictionary[word]++;
            }
            else
            {
                dictionary[word] = 1;
            }
        }
        foreach (string key in dictionary.Keys)
        {
            Console.WriteLine(key + ": " + dictionary[key].ToString());
        }
    }

在这种情况下,这应该很容易适应您的特定需求。

逐行读取文本文件。用空字符分割并删除不必要的空格。

        var totalWords = 0;
        using (StreamReader sr = new StreamReader("abc.txt"))
        {
            while (!sr.EndOfStream)
            {
                int count = sr
                    .ReadLine()
                    .Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries).Count();
                totalWords += count;
            }

你也可以使用下面的代码:

totalWords = fileRead.ReadToEnd().Split(delim, StringSplitOptions.RemoveEmptyEntries).Length; 
相关文章: