2

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

我想从一些字符串中提取

例如从

`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获取所有具有等于的items字符并创建一个.wordsfirst charactercurrent characterDictionary<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. Whis 是因为在该字典中它将添加一个现有字符。

我在查询中包含了一个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);

上面给出的解决方案一切正常,但它给了我比我需要的其他类型。

在此处输入图像描述 我应该怎么做才能得到结果 Dictionary<char, IEnumerable<string>>dictionary 但不是 Dictionary<IGouping<'a,'a>>

我想要的结果如下图所示: 在此处输入图像描述 但是在这里我必须使用 2 个 foreach(s) 进行迭代,这将向我展示我想要的...我无法很好地理解这是如何发生的...

任何建议和建议都将受到欢迎。谢谢你。

4

2 回答 2

3

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

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

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

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

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);
  }
}
于 2013-06-21T13:52:57.987 回答
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]);
于 2013-06-21T13:53:29.860 回答