0

我有一个字典,将字符串存储为键,将整数存储为表示单词及其出现次数的值。用户需要能够按使用次数或按字母顺序按第一个字母对它们进行排序。尽管我对它很陌生,但我更喜欢使用 LINQ。我已经能够使用以下代码根据起始字母对单词进行分组:

public string AlphabeticWordBuilder()
{
    List<String> words = this.myWords.WordsAsList();
    words.Sort();
    return GroupWords(words);
}

private static string GroupWords(List<String> words)
{
    String formatedWords = string.Empty;
    var groups =
        from w in words
        group w by w.First();
    foreach (var group in groups)
    {
        formatedWords += ("\n" + group.Key + ":\n");
        foreach (var w in group)
        {
            formatedWords += (w);
        }
    }
    return formatedWords;
}

然而,这种方法需要我将字典的键转换为列表,导致我丢失我的值。我应该能够以类似的方式按值对字典进行分组,但我不知道如何将键/值关系合并到我用于字母排序的代码中。有人可以发布一个使用 LINQ 按值对字典进行分组的示例吗?

此外,如果可能,我想避免使用 LINQ 方法语法并继续使用上面显示的 LINQ 查询表达式语法。

示例输出按字母顺序:

a开头的单词:

和冒险(等)

按频率输出的示例:

出现 1 次的单词:

东西和问题

我正在尝试做的一个不完整的例子:

public string FrecquincyWordBuilder()
{
    string fromatedWords = string.Empty;
    var groups =
        from w in this.myWords
        group w by w.value;
} 
4

3 回答 3

1

我对您问题中第一个字母的作用有点困惑……但这将按每个单词的第一个字母分组,然后按该单词的出现次数对组进行排序。

   var groups =
      from w in this.myWords
      group w by w.Key.First() into g // group by word first letter
      select new { 
            FirstLetter = g.Key, // the group key is the first letter
            WordsWithThisFirstLetter = // order the words with this first letter
                (from wordWithThisFirstLetter in g
                 order by wordWithThisFirstLetter.Value // the number of occurrences of this word
                 select new { 
                         Word = wordWithThisFirstLetter.Key, // dictionary item key 
                         Occurrences = wordWithThisFirstLetter.Value // dictionary item value
                 }
                ).ToArray()

      };
于 2012-11-10T21:09:38.450 回答
0

如果我理解这个问题,那么解决方案是:

var groups = from kv in myWordsDictionary
                         group kv by kv.Key.First() into g
                         orderby g.Key
                         select g;

使用 lambda:

var groups = myWordsDictionary.GroupBy(d => d.Key.First()).OrderBy(g => g.Key);

GroupBy - 按 Key 第一个字母对 KeyValuePairs 进行分组。

OrderBy - 按字母顺序排列组

于 2012-11-10T21:16:05.133 回答
0

这是我正在使用的代码。

  public string FrecquincyWordBuilder()
  {

      string fromatedWords = string.Empty;
      this.myWords.SortByFrequency();
      Dictionary<string, int> wordsAndFec = this.myWords.wordsAsDictionary();
      return GroupWordsByFercs(wordsAndFec);


  }

  private static string GroupWordsByFercs(Dictionary<string, int> wordsAndFec)
  {
      String formatedWords = string.Empty;
      var groups =
          from w in wordsAndFec
          group w by w.Value;
      foreach (var group in groups)
      {
          formatedWords += ("\n Words ocurring " + group.Key + " times:\n");
          foreach (var w in group)
          {
              formatedWords += (w.Key + " ");
          }
      }
      return formatedWords;
  }
于 2012-11-11T00:13:47.333 回答