使用链接列表计数单词

时间:2013-11-21 02:15:11

标签: c# list

我有一个WordCount类,它有字符串wordDic和int count。接下来,我有一个List。

我有另一个列表,里面有很多单词。我正在尝试使用List来计算List中每个单词的出现次数。

以下是我被困的地方。

class WordCount
{
string wordDic;
int count;

}


    List<WordCount> usd = new List<WordCount>();

    foreach (string word in wordsList)
    {
        if (usd.wordDic.Contains(new WordCount {wordDic=word, count=0 }))
           usd.count[value] = usd.counts[value] + 1;
        else
            usd.Add(new WordCount() {wordDic=word, count=1});

    }

我不知道如何在代码中正确实现此功能,但我正在尝试搜索我的列表以查看wordsList中的单词是否已经存在,如果确实存在,则将1添加到计数中,但如果它没有&#39;然后将其插入usd中,计数为1.

注意: * 我必须使用列表来执行此操作。我不被允许使用哈希表等其他任何东西...... *

5 个答案:

答案 0 :(得分:2)

在您编辑为仅使用列表之前,这是答案...顺便说一句,是什么推动了这一要求?

List<string> words = new List<string> {...};

// For case-insensitive you can instantiate with 
// new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase)
Dictionary<string, int> counts = new Dictionary<string, int>(); 
foreach (string word in words)
{
    if (counts.ContainsKey(word))
    { 
        counts[word] += 1;
    }
    else
    {
        counts[word] = 1;
    }
}

如果你只能使用列表,你可以使用与字典相同的List<KeyValuePair<string,int>> counts(虽然我不确定它会保证唯一性)。解决方案非常相似。如果您只能使用列表,则以下内容将起作用。

        List<string> words = new List<string>{...};
        List<string> foundWord = new List<string>();
        List<int> countWord = new List<int>();
        foreach (string word in words)
        {
            if (foundWord.Contains(word))
            {
                countWord[foundWord.IndexOf(word)] += 1;
            }
            else
            {
                foundWord.Add(word);
                countWord.Add(1);
            }
        }

使用您的WordCount类

        List<string> words = new List<string>{...};
        List<WordCount> foundWord = new List<WordCount>();
        foreach (string word in words)
        {
            WordCount match = foundWord.SingleOrDefault(w => w.wordDic == word);
            if (match!= null)
            {
                match.count += 1;
            }
            else
            {
                foundWord.Add(new WordCount { wordDic = word, count = 1 });
            }
        }

答案 1 :(得分:1)

您可以使用Linq执行此操作。

static void Main(string[] args)
{

    List<string> wordsList = new List<string>()
    {
        "Cat",
        "Dog",
        "Cat",
        "Hat"
    };

    List<WordCount> usd = wordsList.GroupBy(x => x)
                                   .Select(x => new WordCount() { wordDic = x.Key, count = x.Count() })
                                   .ToList();
}

答案 2 :(得分:0)

使用linq:假设您的单词列表:

string[] words = { "blueberry", "chimpanzee", "abacus", "banana", "abacus","apple", "cheese" }; 

你可以这样做:

var count =
   from word in words
   group word.ToUpper() by word.ToUpper() into g
   where g.Count() > 0
   select new { g.Key, Count = g.Count() }; 

(或者在您的情况下,选择新的WordCount()...它将取决于您如何设置构造函数)...

结果如下:

enter image description here

答案 3 :(得分:0)

使用“Contains”方法时,应该使用Dictionary更快。

只需用此

替换您的列表即可

字典usd = new Dictionary();

foreach (string word in wordsList)
{
    if (usd.ContainsKey(word.ToLower()))
       usd.count[word.ToLower()].count++;
    else
        usd.Add(word.ToLower(), new WordCount() {wordDic=word, count=1});

}

答案 4 :(得分:0)

首先,你的所有班级成员都是私人的,因此,他们无法在你班级的某个地方访问。我们假设您也在WordCount课程中使用它们。

其次,您的count成员是int。因此,follow语句将不起作用:

usd.count[value] = usd.counts[value] + 1;

我认为您在countscount之间犯了错误。

要解决您的问题,请找到响应您的单词的计数器。如果存在,则增加计数值,否则创建新值。

foreach (string word in wordsList) {
    WordCount counter = usd.Find(c => c.wordDic == word);
    if (counter != null) // Counter exists
        counter.count++;
    else
        usd.Add(new WordCount() { wordDic=word, count = 1 }); // Create new one
}