是否有单线程来获取此字符串的特定部分?

时间:2014-03-25 23:33:32

标签: c# .net string

我有一个像" a.b.c.d.e"这样的字符串。

如果我想得到一个类似" abcde"," bcde"," cde"," d.e&#34 ;," e"在C#中。什么是最简单的方法?

5 个答案:

答案 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()

Dotnetfiddle

这样做是通过在当前字符前面添加数组中的最后一个值来移动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,但这对我来说也更难写和推理!)