将字符串拆分为单词基于长度的列表c#

FSm*_*FSm 7 c# string list

我有一串用空格分隔的单词.如何根据单词长度将字符串拆分为单词列表?

输入:

" aa aaa aaaa bb bbb bbbb cc ccc cccc cccc bbb bb aa "
Run Code Online (Sandbox Code Playgroud)

输出:

List 1 = { aa, bb, cc}
List 2 = { aaa, bbb, ccc}
List 3 = { aaaa, bbbb, cccc}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 10

您可以使用Where查找与谓词匹配的元素(在这种情况下,具有正确的长度):

string[] words = input.Split();

List<string> twos = words.Where(s => s.Length == 2).ToList();
List<string> threes = words.Where(s => s.Length == 3).ToList();
List<string> fours = words.Where(s => s.Length == 4).ToList();
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用GroupBy一次查找所有组:

var groups = words.GroupBy(s => s.Length);
Run Code Online (Sandbox Code Playgroud)

您也可以使用,ToLookup以便您可以轻松索引以查找特定长度的所有单词:

var lookup = words.ToLookup(s => s.Length);
foreach (var word in lookup[3])
{
    Console.WriteLine(word);
}
Run Code Online (Sandbox Code Playgroud)

结果:

aaa
bbb
ccc

看到它在线工作:ideone


在您的更新中,您似乎想要删除空字符串和重复的单词.您可以通过使用StringSplitOptions.RemoveEmptyEntries而使用后者来执行前者Distinct.

var words = input.Split((char[])null, StringSplitOptions.RemoveEmptyEntries)
                 .Distinct();
var lookup = words.ToLookup(s => s.Length);
Run Code Online (Sandbox Code Playgroud)

输出:

aa, bb, cc
aaa, bbb, ccc
aaaa, bbbb, cccc
Run Code Online (Sandbox Code Playgroud)

看到它在线工作:ideone


Ada*_*dam 6

编辑:我很高兴我的原始答案帮助OP解决了他们的问题.然而,在稍微思考一下这个问题之后,我已经适应了它(我强烈反对我以前的解决方案,我在帖子的最后留下了这个解决方案).

一个简单的方法

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);
Run Code Online (Sandbox Code Playgroud)

说明

首先,我们修剪输入以避免来自外部空间的空元素.然后,我们将字符串拆分为一个数组.如果有多个空格出现在字与字之间,你需要使用StringSplitOptions如在马克的回答.

打完电话后Distinct,只包括一次每个词,我们现在转换wordsIEnumerable<string>Lookup<int, string>,那里的话长度由键代表(int)和他们自己都存储在值的话(string).

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

Lookup<TKey, TElement>表示每个映射到一个或多个值的键集合.一个Lookup<TKey, TElement>酷似Dictionary<TKey, TValue>.区别在于Dictionary将键映射到单个值,而Lookup将键映射到值集合.

您可以Lookup通过调用ToLookup实现的对象来创建a的实例IEnumerable<T>.


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

word => word.LengthKeySelector lambda:它定义了我们想要索引(或组,如果你愿意)Lookup的单词长度.

用法

将所有单词写入控制台

(类似于最初请求输出的问题)

foreach (var grouping in lookup)
{
    Console.WriteLine("{0}: {1}", grouping.Key, string.Join(", ", grouping));
}
Run Code Online (Sandbox Code Playgroud)

产量

2: aa, bb, cc
3: aaa, bbb, ccc
4: aaaa, bbbb, cccc
Run Code Online (Sandbox Code Playgroud)

把一定长度的所有单词放在一个 List

List<String> list3 = lookup[3].ToList();
Run Code Online (Sandbox Code Playgroud)

按键排序

(请注意,这些将返回IOrderedEnumerable<T>,因此不再可以通过密钥访问)

var orderedAscending = lookup.OrderBy(grouping => grouping.Key);
var orderedDescending = lookup.OrderByDescending(grouping => grouping.Key);
Run Code Online (Sandbox Code Playgroud)

原始答案 - 请不要这样做(性能不佳,代码混乱):

string input = " aa aaa aaaa bb bbb bbbb cc ccc cccc cccc bbb bb aa ";
Dictionary<int, string[]> results = new Dictionary<int, string[]>();
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());
}
Run Code Online (Sandbox Code Playgroud)