我有一个像" a.b.c.d.e"这样的字符串。
如果我想得到一个类似" abcde"," bcde"," cde"," d.e&#34 ;," e"在C#中。什么是最简单的方法?
答案 0 :(得分:4)
这样的事情会:
var stringParts = input.Split('.');
var result = Enumerable.Range(0, stringParts.Length)
.Select(i => string.Join(".", stringParts.Skip(i)));
但就像我在评论中所说的那样,请显示您提出的代码以及为什么您希望将其设为单行,这通常不会带来任何好处。这不是代码高手。
答案 1 :(得分:4)
如果你真的用一个陈述来做,你可以试试这个:
var str = "a.b.c.d.e";
var parts = str.Split('.')
.Select((x,idx) => new { idx })
.Select(p => string.Join(".",
str.Split('.').Skip(p.idx))).ToList();
如果您先使用Split
,这可能会更有效:
var parts = str.Split('.');
var result = parts
.Select((x,idx) => new { idx })
.Select(p => string.Join(".",
parts.Skip(p.idx))).ToList();
您也可以不创建匿名类型,只需创建一个int变量:
int i = 0;
var result = parts
.Select(p => string.Join(".", parts.Skip(i++)))
.ToList();
答案 2 :(得分:2)
这非常简洁:
var text = "a.b.c.d.e";
var results =
text
.Split('.')
.Reverse()
.Scan("", (a, x) => x + "." + a)
.Select(x => x.TrimEnd('.'))
.Reverse();
您需要添加Microsoft Reactive Extensions Team的“Interactive Extensions”以获取Scan
运算符。使用NuGet并查找“Ix-Main”。
答案 3 :(得分:1)
我实际上有点喜欢这个问题,不一定是制作,而是有点大脑的乐趣:
"a.b.c.d.e".Split('.').Reverse()
.Aggregate(Enumerable.Empty<string>(), (acc, c) =>
acc.Concat(new [] { c+(acc.LastOrDefault()??"") })
).Reverse()
这样做是通过在当前字符前面添加数组中的最后一个值来移动split数组中的每个字符并构建一个新数组。这是一种相当常见的函数式编程技术。
答案 4 :(得分:1)
嗯,这就是我写它的方式..我知道,不是&#34;一行&#34;,但是如果你还要使用(我建议)一个方法..
IEnumerable<string> AllComponentPartsForward (string s) {
IEnumerable<string> p = s.Split('.');
while (p.Any()) {
yield return string.Join(".", p); // p.ToArray() for .NET 3.5
p = p.Skip(1);
}
}
(我想它可能是&#34;效率更高&#34;使用IndexOf / Substring,但这对我来说也更难写和推理!)