如何计算列表中的相似单词?

时间:2009-11-26 18:18:01

标签: c# asp.net

我有很多相似名字的C#列表我想要计算所有相似的单词。

实施例

假设列表具有这些值

one,one,one,two,two,four,four,four

然后我想像这样计算

one 3
two 2
four 3 

如何从列表中计算出这样的值。

4 个答案:

答案 0 :(得分:9)

我会在逗号上拆分字符串,循环遍历所有结果,并将每个单词添加到值为1的哈希表或字典中。如果单词(键)已存在,则递增该值。

string[] values = "one,one,one,two,two,four,four,four".Split(',');
var counts = new Dictionary<string, int>();

foreach (string value in values) {
    if (counts.ContainsKey(value))
        counts[value] = counts[value] + 1;
    else 
        counts.Add(value, 1);
}

或者,如果您愿意,这里是LINQ解决方案

var counts = values.GroupBy<string, string, int>(k => k, e => 1)  
   .Select(f => new KeyValuePair<string, int>(f.Key, f.Sum()))   
   .ToDictionary(k => k.Key, e => e.Value);  

答案 1 :(得分:7)

以下是基于Linq的解决方案:

    string s = "one,one,one,two,two,four,four,four";
    List<string> list = s.Split(',').ToList();

    Dictionary<string, int> dictionary = list.GroupBy(x => x)
        .ToDictionary(x => x.Key, x => x.Count());

    foreach (var kvp in dictionary)
        Console.WriteLine("{0}: {1}", kvp.Key, kvp.Value);

输出:

one: 3
two: 2
four: 3

此解决方案没有利用公共值是连续的这一事实。如果情况总是如此,可以写一个稍微快一点的解决方案,但这对短列表来说很好,或者如果项目可以按任何顺序排列。

答案 2 :(得分:0)

Dictionaty<string, int> listCount = new Dictionaty<string, int>();
for (int i = 0; i < yourList.Count; i++)
{
 if(listCount.ContainsKey(yourList[i]))
  listCount[yourList[i].Trim()] = listCount[yourList[i].Trim()] + 1;
 else
  listCount[yourList[i].Trim()] = 1;
}

答案 3 :(得分:0)

对于List,您可以执行以下操作(未经测试):

List<string> list = new List<string>()
  {
    "One",
    "One",
    "Two",
    // etc
  }

Dictionary<string, int> d = new Dictionary<string, int>();

foreach (string s in list)
{
  if (d.ContainsKey(s))
    d.Add(s, 1);
  else
    d[s]++;
}

首选(和更干净)方法是使用GroupBy和Count with Linq来完成此操作,但我目前没有输入语法的类型。

祝你好运!