我有一个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.
注意: * 我必须使用列表来执行此操作。我不被允许使用哈希表等其他任何东西...... *
答案 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()...它将取决于您如何设置构造函数)...
结果如下:
答案 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;
我认为您在counts
和count
之间犯了错误。
要解决您的问题,请找到响应您的单词的计数器。如果存在,则增加计数值,否则创建新值。
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
}