【发布时间】:2013-06-21 13:48:47
【问题描述】:
我想这个问题可能会部分重复其他类似的问题,但我在这种情况下遇到了麻烦:
我想从一些字符串中提取句子
例如来自
`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 中的每个字符从words 中获取所有items,其中first 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.
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) 进行迭代,这将向我展示我想要的...我无法很好地理解这是怎么发生的...
欢迎任何建议和意见。谢谢。
【问题讨论】:
-
为什么要写
x.ToCharArray().First()而不是x[0]?为什么要使用Equals()而不是==? -
@svic,这是一个微不足道的决定
x.ToCharArray().First()或x[0]:)Equals()而不是==也具有不重要的相关性。最大的问题是我需要一个Dictionary<char, IEnumerable<string>>。所有回复都将我从Dictionary重定向到ILookup。我试着按照男孩的建议做点什么,但似乎还是遇到了问题。我不需要在控制台上打印结果,而是将该字典发送到另一个需要Dictionary<char, IEnumerable<string>>输入的接收器:) -
我意识到的一件事:您要求
Dictionary中的字符按升序排列。除了不可能之外,Dictionary的键上没有任何顺序。 -
@svick,好的,它们无法订购,我稍后可以在其他上下文中订购它们
-
而 p.s.w.g. 答案的第一部分为您提供了一个使用
Dictionary的好方法。
标签: c# linq dictionary ienumerable