【问题标题】:Using GroupBy in linq to group the letters of a string在 linq 中使用 GroupBy 对字符串的字母进行分组
【发布时间】:2015-12-27 22:24:11
【问题描述】:

我正在尝试进入文件提取文件中的单词并将文件字符串中的每个字母分组。分组应按其字母排序(a,b,c,d, ect..),然后计算每个字母并将每个字母的计数呈现给控制台,如下所示:

一个:56 乙:34 c: 53 d:

所以我正在使用以下代码,但我认为它没有按照我想要的方式工作,有人有什么想法吗?谢谢!

var text = System.IO.File.ReadAllText("file.txt");
        var upper = text.ToUpper();
        var alpha = upper.Where(char.IsLetter).ToArray();
        var grouped = alpha.GroupBy(i => i % 26);
        var a = grouped.First(g => g.Key == 0).Count();

【问题讨论】:

    标签: c# linq group-by


    【解决方案1】:

    您需要在GroupBy 之后添加Select 才能获得所需的结果:

    var result = text
        .ToUpper()
        .Where(char.IsLetter)
        .GroupBy(c => c)
        .Select(g => new { Letter = g.Key, Count = g.Count() });
    

    然后要将结果格式化为"a: 56 b: 34 c: 53",您可以使用string.Joinstring.Format

    string formattedResult = string.Join(" ", result.Select(x => string.Format("{0}: {1}", x.Letter, x.Count)));
    

    【讨论】:

    • 不错的解决方案,但我认为您应该添加结果字母排序
    【解决方案2】:

    这样的事情应该可以工作:

    var text = System.IO.File.ReadAllText("file.txt");
    var dictionary = new Dictionary<char,int>();
    //count every letter
    foreach (var symbol in text)
    {
        //skip non letter characters
        if (!char.IsLetter(symbol))
             continue;
    
        var key = char.ToLower(symbol);
        if (dictionary.ContainsKey(key))
             dictionary[key]++;
        else
             dictionary.Add(key,1);
    }
    //result output
    foreach (var pair in dictionary.OrderBy(p => p.Key))
    {
        Console.Write("{0}: {1} ", pair.Key, pair.Value);
    }
    

    这不是最小的解决方案,但在资源使用方面比分组更好。

    【讨论】:

      【解决方案3】:

      您在操作字母,而不是单词。

      您需要Split(' '),以获取包含单个单词的字符串序列。

      然后您可以按每个单词的第一个字母进行分组。

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 2022-05-22
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 2014-01-06
        • 2016-01-16
        • 2014-01-05
        相关资源
        最近更新 更多