IEnumerable <string> to Dictionary <char,ienumerable <string =“”>&gt; </char,> </string>

时间:2013-06-21 13:48:47

标签: c# linq dictionary ienumerable

我认为这个问题可能会与其他类似的问题部分重复,但我遇到了这种情况的麻烦:

我想从一些字符串句子中提取

例如来自

`string sentence = "We can store these chars in separate variables. We can also test against other string characters.";`

我想构建一个IEnumerable单词;

var separators = new[] {',', ' ', '.'};

IEnumerable<string> words = sentence.Split(separators, StringSplitOptions.RemoveEmptyEntries);

在此之后,执行所有这些words并将第一个字符转换为不同的升序有序字符集。

var firstChars = words.Select(x => x.ToCharArray().First()).OrderBy(x => x).Distinct();

之后,浏览两个集合,并firstChars中的每个字符获取itemswordsfirst character相等的所有current character并创建Dictionary<char, IEnumerable<string>> dictionary

我这样做:

var dictionary = (from k in firstChars
                  from v in words
                  where v.ToCharArray().First().Equals(k)
                  select new { k, v })
                  .ToDictionary(x => x);

以下是问题所在:An item with the same key has already been added. 这是因为在该词典中它将添加一个现有的角色。

我在查询中添加了GroupBy个扩展程序

var dictionary = (from k in firstChars
                  from v in words
                  where v.ToCharArray().First().Equals(k)
                  select new { k, v })
                  .GroupBy(x => x)
                  .ToDictionary(x => x);

上面的解决方案让一切都好,但它给了我其他类型,而不是我需要的。

enter image description here 我应该怎么做才能得到 Dictionary<char, IEnumerable<string>>dictionary Dictionary<IGouping<'a,'a>>

我想要的结果如下图所示: enter image description here 但在这里我必须用2个foreach(s)进行迭代,这将显示我想要的......我无法理解这是怎么发生的......

欢迎任何建议和意见。谢谢。

2 个答案:

答案 0 :(得分:3)

由于关系是一对多,您可以使用查找而不是字典:

var lookup = words.ToLookup(word => word[0]);

loopkup['s'] -> store, separate... as an IEnumerable<string>

如果要显示按第一个char排序的键/值:

for (var sortedEntry in lookup.OrderBy(entry => entry.Key))
{
  Console.WriteLine(string.Format("First letter: {0}", sortedEntry.Key);
  foreach (string word in sortedEntry)
  {
    Console.WriteLine(word);
  }
}

答案 1 :(得分:2)

你可以这样做:

var words = ...
var dictionary = words.GroupBy(w => w[0])
                      .ToDictionary(g => g.Key, g => g.AsEnumerable());

但是为了问题,为什么不使用ILookup

var lookup = words.ToLookup(w => w[0]);