从列表中获取唯一字符串的计数查字典

本文关键字:string 字典 列表 获取 唯一 字符串 | 更新日期: 2023-09-27 18:01:57

我想输入一个List<string[]>

输出是一个字典,其中键是用于索引的唯一字符串,值是一个浮点数数组,数组中的每个位置表示List<string[]>string[]的键的计数

到目前为止,这是我尝试的

static class CT
{
    //Counts all terms in array
    public static Dictionary<string, float[]> Termfreq(List<string[]> text)
    {
        List<string> unique = new List<string>();
        foreach (string[] s in text)
        {
            List<string> groups = s.Distinct().ToList();
            unique.AddRange(groups);
        }
        string[] index = unique.Distinct().ToArray();
        Dictionary<string, float[]> countset = new Dictionary<string, float[]>();

         return countset;
    }
}

 static void Main()
    {
        /* local variable definition */

        List<string[]> doc = new List<string[]>();
        string[] a = { "That", "is", "a", "cat" };
        string[] b = { "That", "bat", "flew","over","the", "cat" };
        doc.Add(a);
        doc.Add(b);
       // Console.WriteLine(doc);

        Dictionary<string, float[]> ret = CT.Termfreq(doc);
        foreach (KeyValuePair<string, float[]> kvp in ret)
        {
            Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
        }

        Console.ReadLine();
    }

我在字典部分卡住了。实现这一点最有效的方法是什么?

从列表中获取唯一字符串的计数<string[]>查字典

听起来你可以这样写:

var dictionary = doc
    .SelectMany(array => array)
    .Distinct()
    .ToDictionary(word => word,
                  word => doc.Select(array => array.Count(x => x == word))
                             .ToArray());

换句话说,首先找到不同的词集,然后为每个词创建一个映射。

要创建映射,请查看原始文档中的每个数组,并查找该数组中单词出现的次数。(所以每个数组映射到一个int。)使用LINQ在整个文档上执行映射,使用ToArray为特定单词创建int[]…这是该单词的字典条目的值。

请注意,这创建了一个Dictionary<string, int[]>而不是Dictionary<string, float[]> -这对我来说似乎更明智,但如果您真的想要,您可以将Count的结果强制转换为float