将字符串拆分为单词基于长度的列表c#
我有一串用空格分隔的单词。 如何根据单词长度将字符串拆分为单词列表?
例
输入:
" aa aaa aaaa bb bbb bbbb cc ccc cccc cccc bbb bb aa "
输出:
List 1 = { aa, bb, cc} List 2 = { aaa, bbb, ccc} List 3 = { aaaa, bbbb, cccc}
编辑:我很高兴我的原始答案帮助OP解决了他们的问题。 然而,在稍微思考一下这个问题之后,我已经对它进行了调整(我强烈反对我以前的解决方案,我在post的最后留下了这个解决方案)。
一个简单的方法
string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc cccc bbb bb aa "; var words = input.Trim().Split().Distinct(); var lookup = words.ToLookup(word => word.Length);
说明
首先,我们修剪输入以避免来自外部空间的空元素。 然后,我们将字符串拆分为数组。 如果单词之间出现多个空格,则需要使用StringSplitOptions
,如Mark的答案中所示 。
在调用Distinct
仅包含每个单词一次之后,我们现在将words
从IEnumerable
转换为Lookup
,其中单词’length由key (int)
表示,单词本身存储在值中(string)
。
坚持下去,怎么可能呢? 我们不是每个键都有多个单词吗? 当然,但这正是Lookup
类的用途:
Lookup
表示每个映射到一个或多个值的键的集合。Lookup
类似于Dictionary
。 区别在于Dictionary将键映射到单个值,而Lookup将键映射到值集合 。您可以通过在实现
IEnumerable
的对象上调用ToLookup
来创建Lookup
实例。
注意
没有公共构造函数来创建Lookup的新实例。 此外,Lookup对象是不可变的,也就是说,在创建后不能在Lookup中添加或删除元素或键。
word => word.Length
是KeySelector lambda:它定义了我们想要索引(或组,如果你愿意) Lookup
单词的长度。
用法
将所有单词写入控制台
(类似于最初请求输出的问题)
foreach (var grouping in lookup) { Console.WriteLine("{0}: {1}", grouping.Key, string.Join(", ", grouping)); }
产量
2: aa, bb, cc 3: aaa, bbb, ccc 4: aaaa, bbbb, cccc
将一定长度的所有单词放入List
List list3 = lookup[3].ToList();
按键排序
(请注意,这些将返回IOrderedEnumerable
,因此不再可以按键访问)
var orderedAscending = lookup.OrderBy(grouping => grouping.Key); var orderedDescending = lookup.OrderByDescending(grouping => grouping.Key);
原始答案 – 请不要这样做 (性能不佳,代码混乱):
string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc cccc bbb bb aa "; Dictionary results = new Dictionary(); var grouped = input.Trim().Split().Distinct().GroupBy(s => s.Length) .OrderBy(g => g.Key); // or: OrderByDescending(g => g.Key); foreach (var grouping in grouped) { results.Add(grouping.Key, grouping.ToArray()); }
您可以使用Where
来查找与谓词匹配的元素(在这种情况下,具有正确的长度):
string[] words = input.Split(); List twos = words.Where(s => s.Length == 2).ToList(); List threes = words.Where(s => s.Length == 3).ToList(); List fours = words.Where(s => s.Length == 4).ToList();
或者,您可以使用GroupBy
一次查找所有组:
var groups = words.GroupBy(s => s.Length);
您还可以使用ToLookup
以便您可以轻松索引以查找特定长度的所有单词:
var lookup = words.ToLookup(s => s.Length); foreach (var word in lookup[3]) { Console.WriteLine(word); }
结果:
AAA BBB CCC
看它在线工作: ideone
在您的更新中,您似乎想要删除空字符串和重复的单词。 您可以使用StringSplitOptions.RemoveEmptyEntries
执行前者,使用Distinct
可以执行后者。
var words = input.Split((char[])null, StringSplitOptions.RemoveEmptyEntries) .Distinct(); var lookup = words.ToLookup(s => s.Length);
输出:
aa, bb, cc aaa, bbb, ccc aaaa, bbbb, cccc
看它在线工作: ideone
首先,让我们声明一个可以保存长度的单词以及单词列表
public class WordList { public int WordLength { get; set; } public List Words { get; set; } }
现在,我们可以构建一个单词列表列表
string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc "; string[] words = input.Trim().Split(); List list = words .GroupBy(w => w.Length) .OrderBy(group => group.Key) .Select(group => new WordList { WordLength = group.Key, Words = group.Distinct().OrderBy(s => s).ToList() }) .ToList();
列表分别按长度和字母顺序排序。
结果
例如
list[2].WordLength ==> 4 list[2].Words[1] ==> "bbbb"
UPDATE
如果需要,可以立即处理结果,而不是将其放入数据结构中
string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc "; var query = input .Trim() .Split() .GroupBy(w => w.Length) .OrderBy(group => group.Key); // Process the result here foreach (var group in query) { // group.Key ==> length of words foreach (string word in group.Distinct().OrderBy(w => w)) { ... } }
您可以使用Linq GroupBy
编辑现在我应用Linq生成您想要输出的字符串列表。
edit2应用了多个输入,单个输出,如编辑问题。 这只是Linq的一个不同的电话
string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc "; var list = input.Split(' '); var grouped = list.GroupBy(s => s.Length); foreach (var elem in grouped) { string header = "List " + elem.Key + ": "; // var line = elem.Aggregate((workingSentence, next) => next + ", " + workingSentence); // if you want single items, use this var line = elem.Distinct().Aggregate((workingSentence, next) => next + ", " + workingSentence); string full = header + " " + line; Console.WriteLine(full); } // output: please note the last blank in the input string! this generates the 0 list List 0: , List 2: cc, bb, aa List 3: ccc, bbb, aaa List 4: cccc, bbbb, aaaa
有点冗长的解决方案,但确实得到了字典中的结果
class Program { public static void Main() { Print(); Console.ReadKey(); } private static void Print() { GetListOfWordsByLength(); foreach (var list in WordSortedDictionary) { list.Value.ForEach(i => { Console.Write(i + ","); }); Console.WriteLine(); } } private static void GetListOfWordsByLength() { string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc "; string[] inputSplitted = input.Split(' '); inputSplitted.ToList().ForEach(AddToList); } static readonly SortedDictionary> WordSortedDictionary = new SortedDictionary>(); private static void AddToList(string s) { if (s.Length > 0) { if (WordSortedDictionary.ContainsKey(s.Length)) { List list = WordSortedDictionary[s.Length]; list.Add(s); } else { WordSortedDictionary.Add(s.Length, new List {s}); } } } }