将字符串拆分为单词基于长度的列表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仅包含每个单词一次之后,我们现在将wordsIEnumerable转换为Lookup ,其中单词’length由key (int)表示,单词本身存储在值中(string)

坚持下去,怎么可能呢? 我们不是每个键都有多个单词吗? 当然,但这正是Lookup类的用途:

Lookup表示每个映射到一个或多个值的键的集合。 Lookup类似于Dictionary 。 区别在于Dictionary将键映射到单个值,而Lookup将键映射到值集合

您可以通过在实现IEnumerable的对象上调用ToLookup来创建Lookup实例。


注意
没有公共构造函数来创建Lookup的新实例。 此外,Lookup对象是不可变的,也就是说,在创建后不能在Lookup中添加或删除元素或键。

word => word.LengthKeySelector 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}); } } } }